OCI8 ΠΈ динамичСская трассировка DTrace

OCI8 2.0 содСрТит статичСскиС Π·ΠΎΠ½Π΄Ρ‹ DTrace, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСмах, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ DTrace. Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ PHP ΠΈ DTrace описываСт Ρ€Π°Π·Π΄Π΅Π» ДинамичСская трассировка DTrace.

Установка OCI8 с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ DTrace

Для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ DTrace Π² PHP OCI8, собСритС OCI8 ΠΊΠ°ΠΊ раздСляСмый ΠΌΠΎΠ΄ΡƒΠ»ΡŒ послС установки ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ окруТСния PHP_DTRACE.

$ export PHP_DTRACE=yes
$ pecl install oci8

ΠžΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ php.ini, Π·Π°Π΄Π°Π² extension_dir Ρ€Π°Π²Π½Ρ‹ΠΌ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ создался oci8.so, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

extension=oci8.so

Если Π²Ρ‹ установили PHP OCI8 ΠΈΠ· PECL с использованиСм phpize ΠΈ configure (вмСсто pecl), Π²Π°ΠΌ всС Π΅Ρ‰Ρ‘ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ PHP_DTRACE=yes. Π­Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ опция --enable-dtrace Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½Π° ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΌ скриптом configure модуля PECL.

Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΎΠ± установкС PECL ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Ρ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Установка ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ PECL.

БтатичСскиС Π·ΠΎΠ½Π΄Ρ‹ DTrace Π² PHP OCI8

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ статичСскиС Π·ΠΎΠ½Π΄Ρ‹ доступны Π² PHP OCI8
Имя Π·ΠΎΠ½Π΄Π° ОписаниС Π·ΠΎΠ½Π΄Π° АргумСнты Π·ΠΎΠ½Π΄Π°
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.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ connection ΠΈ statement ΡΠ²Π»ΡΡŽΡ‚ΡΡ указатСлями Π½Π° Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ структуры, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ для отслСТивания соСдинСний ΠΈ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Ρ… запросов.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ client_id устанавливаСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ oci_set_client_identifier().

Π―Π΄Ρ€ΠΎ PHP Ρ‚Π°ΠΊΠΆΠ΅ содСрТит статичСскиС Π·ΠΎΠ½Π΄Ρ‹. Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Ρ€Π°Π·Π΄Π΅Π» БтатичСскиС Π·ΠΎΠ½Π΄Ρ‹ DTrace Π² ядрС PHP.

Π’Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½Ρ‹Π΅ Π·ΠΎΠ½Π΄Ρ‹ DTrace Π² OCI8
Имя зонда
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.

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ списка статичСских Π·ΠΎΠ½Π΄ΠΎΠ² DTrace Π² PHP OCI8

Для получСния списка доступных Π·ΠΎΠ½Π΄ΠΎΠ², запуститС процСсс 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.

Π‘Ρ‚ΠΎΠ»Π±Π΅Ρ† "Function" содСрТит ΠΈΠΌΠ΅Π½Π° Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ…, написанных Π½Π° C, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ PHP, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… содСрТатся ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Ρ‹ (Provider).

Если процСсс PHP Π½Π΅ Π·Π°ΠΏΡƒΡ‰Π΅Π½, Ρ‚ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π·ΠΎΠ½Π΄ΠΎΠ² PHP ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования DTrace с PHP OCI8

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ продСмонстрированы основы скриптового языка DTrace D.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #1 user_oci8_probes.d для трассировки всСх статичСских Π·ΠΎΠ½Π΄ΠΎΠ² PHP OCI8 с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ DTrace Π½Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅

#!/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 OCI8 уровня ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π½Π° протяТСнии Ρ€Π°Π±ΠΎΡ‚Ρ‹ скрипта PHP. ЗапускаСм скрипт 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

ПослС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ диагностики D-скрипт ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Ρ€Π²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ наТатия CTRL+C.

οΌ‹Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ

ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ Π΅Ρ‰Ρ‘ Π½Π΅ добавляли примСчания для страницы