O OCI8 2.0 introduziu sondas DTrace estáticas que podem ser usadas em sistemas operacionais compatíveis com o DTrace. Consulte Rastreamento Dinâmico DTrace para obter uma visão geral do PHP e do DTrace.
Para habilitar o suporte a DTrace no PHP OCI8, o OCI8 deve ser compilado como uma extensão
compartilhada após a definição de PHP_DTRACE
.
$ export PHP_DTRACE=yes $ pecl install oci8
Edite o php.ini, defina extension_dir para o diretório que contém o oci8.so criado e também habilite a extesão adicionando:
extension=oci8.so
Se o PHP OCI8 for instalado a partir do PECL usando phpize e
configure (ao invés
de pecl), ainda será necessário definir
PHP_DTRACE=yes
. Isto acontece porque
a opção --enable-dtrace
será ignorada pelo
script configure limitado de um pacote PECL.
Consulte Instalação de extensões PECL para intruções gerais de instalação via PECL.
Nome da Sonda | Descrição da Sonda | Argumentos da Sonda |
---|---|---|
oci8-connect-entry |
Iniciada por oci_connect(), oci_pconnect() e oci_new_connect(). É ativada antes da conexão ao banco de dados ser estabelecida. | char *username, char *dbname, char *charset, long session_mode, int persistent, int exclusive |
oci8-connect-return |
É ativada no final da conexão. | void *connection |
oci8-check-connection |
É ativada se um erro Oracle possa ter tornado a conexão inválida. | void *connection, char *client_id, int is_open, long errcode, unsigned long server_status |
oci8-sqltext |
É ativada quando oci_parse() é executada. | void *connection, char *client_id, void *statement, char *sql |
oci8-connection-close |
É ativada quando a conexão ao banco de dados é completamente destruída. | void *connection |
oci8-error |
É ativada se um erro Oracle ocorrer. | int status, long errcode |
oci8-execute-mode |
É ativada na função oci_execute() para mostrar o modo de execução. | void *connection, char *client_id, void *statement, unsigned int mode |
Estas sondas são úteis para rastrear scripts OCI8.
As variáveis connection e statement são ponteiros para estruturas internas usados para rastrear conexões e instruções executadas do PHP.
A variável client_id é o valor definido por oci_set_client_identifier().
O núcleo do PHP também tem sondas estáticas. Consulte Sondas Estáticas DTrace no Núcleo do PHP.
Nome da Sonda |
---|
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 |
Estas sondas são úteis para mantenedores do OCI8. Consulte o código-fonte para argumentos e para ver quando elas serão ativadas.
Para listar sondas disponíveis, inicie um processo PHP e depois execute:
# dtrace -l
O resultado será similar a:
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
Os valores da coluna PROVIDER consistem no prefixo phpoci
e
o ID fo processo PHP atual.
A coluna FUNCTION refere-se aos nomes de função da implementação C interna do PHP onde cada provedor está localizado.
Se um processo PHP não estiver em execução, nenhuma sonda PHP será exibida.
Este exemplo mostra o básico da linguagem de script D do DTrace.
Exemplo #1 user_oci8_probes.d para rastrear todas as Sondas Estáticas PHP OCI8 em nível de usuário com 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); }
Este script usa a opção -Z
para
dtrace, permitindo que ele seja executado quando não houver
processo PHP em execução. Se esta opção fosse omitida, o script
terminaria imediatamente quando nenhum executável do PHP estivesse em execução
porque ele sabe que nenhuma das sondas a serem monitoradas
existiriam.
Em máquinas com múltiplas CPUs, a ordem das sondas pode não parecer sequencial. Isto depende de qual CPU está processando as sondas, e como os threads migram através dos CPUs. Exibir o horário de cada sonda ajuda a reduzir a confusão.
O script rastreia todos os pontos de sondas estáticas do PHP OCI8 em nível de usuário, durante toda a execução do script PHP. Execute o script D:
# ./user_oci8_probes.d
Execute uma aplicação ou um script PHP. O script D de monitoramento exeubirá os argumentos de cada sonda assim que ativada. Por exemplo, um simples script PHP que consulta uma tabela pode produzir o seguinte resultado de rastreamento:
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
Quando o monitoramento estiver concluído, o script D pode ser encerrado com um CTRL+C.