Files
archived-doc-pt-br/reference/oci8/dtrace.xml
2024-12-20 08:45:21 -03:00

407 lines
13 KiB
XML
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: f4c44b86948f70a7e89f582b500e2595452e00f0 Maintainer: leonardolara Status: ready -->
<chapter xml:id="oci8.dtrace" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>OCI8 e Rastreamento dinâmico DTrace</title>
<para>
O OCI8 2.0 introduziu sondas DTrace estáticas que podem ser usadas em
sistemas operacionais compatíveis com o DTrace.
Consulte <link linkend="features.dtrace">Rastreamento Dinâmico DTrace</link>
para obter uma visão geral do PHP e do DTrace.
</para>
<section>
<title>Instalando OCI8 com suporte a DTrace</title>
<para>
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 <literal>PHP_DTRACE</literal>.
</para>
<para>
<informalexample>
<screen>
<![CDATA[
$ export PHP_DTRACE=yes
$ pecl install oci8
]]>
</screen>
</informalexample>
</para>
<para>
Edite o php.ini,
defina <link linkend="ini.extension-dir">extension_dir</link> para o
diretório que contém o <filename>oci8.so</filename> criado e também
habilite a extesão adicionando:
</para>
<para>
<informalexample>
<screen>
<![CDATA[
extension=oci8.so
]]>
</screen>
</informalexample>
</para>
<para>
Se o PHP OCI8 for instalado a partir do PECL usando <filename>phpize</filename> e
<filename>configure</filename> (ao invés
de <filename>pecl</filename>), ainda será necessário definir
<literal>PHP_DTRACE=yes</literal>. Isto acontece porque
a opção <literal>--enable-dtrace</literal> será ignorada pelo
script <filename>configure</filename> limitado de um pacote PECL.
</para>
<para>
Consulte <link linkend="install.pecl">Instalação de extensões
PECL</link> para intruções gerais de instalação via PECL.
</para>
</section>
<section>
<title>Sondas Estáticas DTrace no PHP OCI8</title>
<table>
<title>As seguintes sondas estáticas estão disponíveis no PHP OCI8</title>
<tgroup cols="2">
<thead>
<row>
<entry>Nome da Sonda</entry>
<entry>Descrição da Sonda</entry>
<entry>Argumentos da Sonda</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>oci8-connect-entry</literal></entry>
<entry>Iniciada por oci_connect(), oci_pconnect() e oci_new_connect(). É ativada antes da conexão ao banco de dados ser estabelecida.</entry>
<entry>char *<varname>username</varname>, char *<varname>dbname</varname>, char *<varname>charset</varname>, long <varname>session_mode</varname>, int <varname>persistent</varname>, int <varname>exclusive</varname></entry>
</row>
<row>
<entry><literal>oci8-connect-return</literal></entry>
<entry>É ativada no final da conexão.</entry>
<entry>void *<varname>connection</varname></entry>
</row>
<row>
<entry><literal>oci8-check-connection</literal></entry>
<entry>É ativada se um erro Oracle possa ter tornado a conexão inválida.</entry>
<entry>void *<varname>connection</varname>, char *<varname>client_id</varname>, int <varname>is_open</varname>, long <varname>errcode</varname>, unsigned long <varname>server_status</varname></entry>
</row>
<row>
<entry><literal>oci8-sqltext</literal></entry>
<entry>É ativada quando oci_parse() é executada.</entry>
<entry>void *<varname>connection</varname>, char *<varname>client_id</varname>, void *<varname>statement</varname>, char *<varname>sql</varname></entry>
</row>
<row>
<entry><literal>oci8-connection-close</literal></entry>
<entry>É ativada quando a conexão ao banco de dados é completamente destruída.</entry>
<entry>void *<varname>connection</varname></entry>
</row>
<row>
<entry><literal>oci8-error</literal></entry>
<entry>É ativada se um erro Oracle ocorrer.</entry>
<entry>int <varname>status</varname>, long <varname>errcode</varname></entry>
</row>
<row>
<entry><literal>oci8-execute-mode</literal></entry>
<entry>É ativada na função <function>oci_execute</function> para mostrar o modo de execução.</entry>
<entry>void *<varname>connection</varname>, char *<varname>client_id</varname>, void *<varname>statement</varname>, unsigned int <varname>mode</varname></entry>
</row>
</tbody>
</tgroup>
</table>
<para>
Estas sondas são úteis para rastrear scripts OCI8.
</para>
<para>
As variáveis <varname>connection</varname> e <varname>statement</varname>
são ponteiros para estruturas internas usados para rastrear
conexões e instruções executadas do PHP.
</para>
<para>
A variável <varname>client_id</varname> é o valor definido
por <function>oci_set_client_identifier</function>.
</para>
<para>
</para>
<para>
</para>
<para>
</para>
<para>
O núcleo do PHP também tem sondas estáticas.
Consulte <link linkend="features.dtrace.static-probes">Sondas Estáticas
DTrace no Núcleo do PHP</link>.
</para>
<table>
<title>Sondas DTrace Internas de Depuração no OCI8</title>
<tgroup cols="2">
<thead>
<row>
<entry>Nome da Sonda</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>oci8-connect-expiry</literal></entry>
</row>
<row>
<entry><literal>oci8-connect-lookup</literal></entry>
</row>
<row>
<entry><literal>oci8-connect-p-dtor-close</literal></entry>
</row>
<row>
<entry><literal>oci8-connect-p-dtor-release</literal></entry>
</row>
<row>
<entry><literal>oci8-connect-type</literal></entry>
</row>
<row>
<entry><literal>oci8-sesspool-create</literal></entry>
</row>
<row>
<entry><literal>oci8-sesspool-stats</literal></entry>
</row>
<row>
<entry><literal>oci8-sesspool-type</literal></entry>
</row>
</tbody>
</tgroup>
</table>
<para>
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>
</section>
<section>
<title>Listando Sondas Estáticas DTrace no PHP OCI8</title>
<para>
Para listar sondas disponíveis, inicie um processo PHP e depois execute:
<informalexample>
<programlisting>
<![CDATA[
# dtrace -l
]]>
</programlisting>
</informalexample>
</para>
<para>
O resultado será similar a:
<informalexample>
<programlisting>
<![CDATA[
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
]]>
</programlisting>
</informalexample>
</para>
<para>
Os valores da coluna PROVIDER consistem no prefixo <literal>phpoci</literal> e
o ID fo processo PHP atual.
</para>
<para>
A coluna FUNCTION refere-se aos nomes de função da implementação C
interna do PHP onde cada provedor está localizado.
</para>
<para>
Se um processo PHP não estiver em execução, nenhuma sonda PHP será exibida.
</para>
</section>
<section>
<title>Exemplo de DTrace com PHP OCI8</title>
<para>
Este exemplo mostra o básico da linguagem de script D do DTrace.
<example>
<title><filename>user_oci8_probes.d</filename> para rastrear todas as Sondas Estáticas PHP OCI8 em nível de usuário com DTrace</title>
<programlisting>
<![CDATA[
#!/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);
}
]]>
</programlisting>
</example>
</para>
<para>
Este script usa a opção <literal>-Z</literal> para
<filename>dtrace</filename>, 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.
</para>
<para>
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.
</para>
<para>
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:
<informalexample>
<programlisting>
<![CDATA[
# ./user_oci8_probes.d
]]>
</programlisting>
</informalexample>
</para>
<para>
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:
<informalexample>
<programlisting>
<![CDATA[
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
]]>
</programlisting>
</informalexample>
</para>
<para>
Quando o monitoramento estiver concluído, o script D pode ser encerrado com um
<keycombo action='simul'><keycap>CTRL</keycap><keycap>C</keycap></keycombo>.
</para>
</section>
<section>
&reftitle.seealso;
<simplelist>
<member><link linkend="features.dtrace">Rastreamento Dinâmico DTrace</link></member>
</simplelist>
</section>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->