OCI8 및 DTrace 동적 추적

OCI8 2.0은 DTrace를 지원하는 운영 체제에서 사용할 수 있는 정적 DTrace 프로브를 도입했습니다. PHP 및 DTrace에 대한 개요는 DTrace 동적 추적을 참조하세요.


DTrace 지원으로 OCI8 설치

PHP OCI8에서 DTrace 지원을 활성화하려면 PHP_DTRACE를 설정한 후 OCI8을 공유 확장으로 빌드하십시오.

$ export PHP_DTRACE=yes
$ pecl install oci8
                

php.ini를 편집하고 extension_dir을 생성된 oci8.so가 있는 디렉토리로 설정하고 다음을 추가하여 확장을 활성화합니다.

extension=oci8.so
                

phpize를 사용하여 PECL에서 PHP OCI8을 설치하고 (pecl 대신) configure하는 경우에도 여전히 PHP_DTRACE=yesconfigure해야 합니다. --enable-dtrace 옵션이 PECL 번들의 제한된 configure 스크립트에서 무시되기 때문입니다.

일반 PECL 설치 지침은 PECL 확장 설치를 참조하십시오.


PHP OCI8의 DTrace 정적 프로브

다음 정적 프로브는 PHP OCI8에서 사용할 수 있습니다.

Probe Name Probe Description Probe Arguments
oci8-connect-entry oci_connect(), oci_pconnect() 및 oci_new_connect()에 의해 시작됩니다. 데이터베이스 연결이 설정되기 전에 발생합니다. char *username, char *dbname, char *charset, long session_mode, int persistent, int exclusive
oci8-connect-return 연결이 끝나면 발생합니다. void *connection
oci8-check-connection Oracle 오류로 인해 연결이 유효하지 않은 경우 발생합니다. void *connection, char *client_id, int is_open, long errcode, unsigned long server_status
oci8-sqltext oci_parse()가 실행될 때 발생합니다. void *connection, char *client_id, void *statement, char *sql
oci8-connection-close 데이터베이스에 대한 연결이 완전히 끊어지면 발생합니다. void *connection
oci8-error Oracle 오류가 발생하면 발생합니다. int status, long errcode
oci8-execute-mode 실행 모드를 표시하기 위해 oci_execute()에서 실행됩니다. void *connection, char *client_id, void *statement, unsigned int mode

이러한 프로브는 OCI8 스크립트를 추적하는 데 유용합니다.

connectionstatement은 PHP 연결 및 실행된 명령문을 추적하는 데 사용되는 내부 구조에 대한 포인터입니다.

client_idoci_set_client_identifier()에서 설정한 값입니다.

Core PHP에는 정적 프로브도 있습니다. 핵심 PHP의 DTrace 정적 프로브를 참조하세요.

OCI8의 내부 디버깅 DTrace 프로브

Probe Name
oci8-connect-expiry
oci8-connect-lookup
oci8-connect-p-dtor-close
oci8-connect-p-dtor-release
oci8-connect-type
oci8-sesspool-create
oci8-sesspool-stats
oci8-sesspool-type

이 프로브는 OCI8 유지 관리자에게 유용합니다. 인수 및 실행 시점을 보려면 OCI8 소스 코드를 참조하십시오.


PHP OCI8에서 DTrace 정적 프로브 나열

사용 가능한 프로브를 나열하려면 PHP 프로세스를 시작한 후 다음을 실행합니다.

# dtrace -l
                

출력은 다음과 유사합니다.

ID   PROVIDER            MODULE                          FUNCTION NAME
[ . . . ]
17 phpoci22116           oci8.so   php_oci_dtrace_check_connection oci8-check-connection
18 phpoci22116           oci8.so                php_oci_do_connect oci8-connect-entry
19 phpoci22116           oci8.so         php_oci_persistent_helper oci8-connect-expiry
20 phpoci22116           oci8.so             php_oci_do_connect_ex oci8-connect-lookup
21 phpoci22116           oci8.so  php_oci_pconnection_list_np_dtor oci8-connect-p-dtor-close
22 phpoci22116           oci8.so  php_oci_pconnection_list_np_dtor oci8-connect-p-dtor-release
23 phpoci22116           oci8.so                php_oci_do_connect oci8-connect-return
24 phpoci22116           oci8.so             php_oci_do_connect_ex oci8-connect-type
25 phpoci22116           oci8.so          php_oci_connection_close oci8-connection-close
26 phpoci22116           oci8.so                     php_oci_error oci8-error
27 phpoci22116           oci8.so         php_oci_statement_execute oci8-execute-mode
28 phpoci22116           oci8.so              php_oci_create_spool oci8-sesspool-create
29 phpoci22116           oci8.so            php_oci_create_session oci8-sesspool-stats
30 phpoci22116           oci8.so            php_oci_create_session oci8-sesspool-type
31 phpoci22116           oci8.so          php_oci_statement_create oci8-sqltext
                

Provider 열 값은 phpoci와 현재 실행 중인 PHP 프로세스의 프로세스 ID로 구성됩니다.

함수 열은 각 공급자가 위치한 PHP의 내부 C 구현 함수 이름을 나타냅니다.

PHP 프로세스가 실행되고 있지 않으면 PHP 프로브가 표시되지 않습니다.


PHP OCI8을 사용한 DTrace 예제

이 예는 DTrace D 스크립팅 언어의 기본 사항을 보여줍니다.

예제 #1 user_oci8_probes.d는 DTrace를 사용하여 모든 사용자 수준 PHP OCI8 정적 프로브를 추적하기 위한 것입니다.

#!/usr/sbin/dtrace -Zs

#pragma D option quiet

php*:::oci8-connect-entry
{
    printf("%lld: PHP connect-entry\n", walltimestamp);
    printf("  credentials=\"%s@%s\"\n", arg0 ? copyinstr(arg0) : "", arg1 ? copyinstr(arg1) : "");
    printf("  charset=\"%s\"\n", arg2 ? copyinstr(arg2) : "");
    printf("  session_mode=%ld\n", (long)arg3);
    printf("  persistent=%d\n", (int)arg4);
    printf("  exclusive=%d\n", (int)arg5);
}

php*:::oci8-connect-return
{
    printf("%lld: PHP oci8-connect-return\n", walltimestamp);
    printf("  connection=0x%p\n", (void *)arg0);
}

php*:::oci8-connection-close
{
    printf("%lld: PHP oci8-connect-close\n", walltimestamp);
    printf("  connection=0x%p\n", (void *)arg0);
}

php*:::oci8-error
{
    printf("%lld: PHP oci8-error\n", walltimestamp);
    printf("  status=%d\n", (int)arg0);
    printf("  errcode=%ld\n", (long)arg1);
}

php*:::oci8-check-connection
{
    printf("%lld: PHP oci8-check-connection\n", walltimestamp);
    printf("  connection=0x%p\n", (void *)arg0);
    printf("  client_id=\"%s\"\n", arg1 ? copyinstr(arg1) : "");
    printf("  is_open=%d\n", arg2);
    printf("  errcode=%ld\n", (long)arg3);
    printf("  server_status=%lu\n", (unsigned long)arg4);
}

php*:::oci8-sqltext
{
    printf("%lld: PHP oci8-sqltext\n", walltimestamp);
    printf("  connection=0x%p\n", (void *)arg0);
    printf("  client_id=\"%s\"\n", arg1 ? copyinstr(arg1) : "");
    printf("  statement=0x%p\n", (void *)arg2);
    printf("  sql=\"%s\"\n", arg3 ? copyinstr(arg3) : "");
}

php*:::oci8-execute-mode
{
    printf("%lld: PHP oci8-execute-mode\n", walltimestamp);
    printf("  connection=0x%p\n", (void *)arg0);
    printf("  client_id=\"%s\"\n", arg1 ? copyinstr(arg1) : "");
    printf("  statement=0x%p\n", (void *)arg2);
    printf("  mode=0x%x\n", arg3);
}
                

이 스크립트는 dtrace에 -Z 옵션을 사용하여 PHP 프로세스가 실행되고 있지 않을 때 실행할 수 있습니다. 이 옵션을 생략하면 모니터링할 프로브가 존재하지 않는다는 것을 알기 때문에 실행 중인 PHP 실행 파일이 없을 때 스크립트가 즉시 종료됩니다.

다중 CPU 시스템에서 프로브 순서는 순차적으로 나타나지 않을 수 있습니다. 이는 어떤 CPU가 프로브를 처리하고 있었고 스레드가 CPU 간에 마이그레이션되는 방식에 따라 다릅니다. 프로브 타임스탬프를 표시하면 혼동을 줄이는 데 도움이 됩니다.

스크립트는 PHP 스크립트를 실행하는 동안 모든 사용자 수준 PHP OCI8 정적 프로브 지점을 추적합니다. D 스크립트를 실행합니다.

# ./user_oci8_probes.d
                

PHP 스크립트 또는 애플리케이션을 실행합니다. 모니터링 D 스크립트는 실행될 때 각 프로브의 인수를 출력합니다. 예를 들어, 테이블을 쿼리하는 간단한 PHP 스크립트는 다음과 같은 추적 출력을 생성할 수 있습니다.

1381794982092854582: PHP connect-entry
  credentials="hr@localhost/pdborcl"
  charset=""
  session_mode=0
  persistent=0
  exclusive=0
1381794982183158766: PHP oci8-connect-return
  connection=0x7f4a7907bfb8
1381794982183594576: PHP oci8-sqltext
  connection=0x7f4a7907bfb8
  client_id="Chris"
  statement=0x7f4a7907c2a0
  sql="select * from employees"
1381794982183783706: PHP oci8-execute-mode
  connection=0x7f4a7907bfb8
  client_id="Chris"
  statement=0x7f4a7907c2a0
  mode=0x20
1381794982444344390: PHP oci8-connect-close
  connection=0x7f4a7907bfb8
                

모니터링이 완료되면 ^C로 D 스크립트를 종료할 수 있습니다.


기타