<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/book.oci8.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ja',
  ),
  'this' => 
  array (
    0 => 'oci8.dtrace.php',
    1 => 'OCI8 および DTrace 動的トレーシング',
    2 => 'OCI8 および DTrace 動的トレーシング',
  ),
  'up' => 
  array (
    0 => 'book.oci8.php',
    1 => 'OCI8',
  ),
  'prev' => 
  array (
    0 => 'oci8.taf.php',
    1 => 'OCI8 Transparent Application Failover (TAF) Support',
  ),
  'next' => 
  array (
    0 => 'oci8.datatypes.php',
    1 => 'ドライバでサポートされるデータ型',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ja',
    'path' => 'reference/oci8/dtrace.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="oci8.dtrace" class="chapter">
 <h1 class="title">OCI8 および DTrace 動的トレーシング</h1>

 <p class="para">
  OCI8 2.0 では、DTrace をサポートする OS 上で使用できる
  静的な DTrace プローブが導入されました。
  PHP および DTrace の概要については、<a href="features.dtrace.php" class="link">DTrace 動的トレーシング</a> をご覧ください。
 </p>

<div class="section">
 <h2 class="title">DTrace サポート付きで OCI8 をインストール</h2>
  <p class="para">
   PHP OCI8 で DTrace のサポートを有効にするには、
   <code class="literal">PHP_DTRACE</code> を設定後、
   OCI8 を共用拡張モジュールとしてビルドします。
  </p>
  <p class="para">
   <div class="informalexample">
    <div class="example-contents screen">
<div class="cdata"><pre>
$ export PHP_DTRACE=yes
$ pecl install oci8
</pre></div>
    </div>
   </div>
  </p>
  <p class="para">
   php.ini を編集し、作成された <var class="filename">oci8.so</var> がある
   ディレクトリを <a href="ini.core.php#ini.extension-dir" class="link">extension_dir</a> に
   設定します。
   さらに以下のように追加してその拡張モジュールを有効にします。
  </p>
  <p class="para">
   <div class="informalexample">
    <div class="example-contents screen">
<div class="cdata"><pre>
extension=oci8.so
</pre></div>
    </div>
   </div>
  </p>
  <p class="para">
   もし、<var class="filename">phpize</var> および <var class="filename">configure</var> を
   （ <var class="filename">pecl</var> の代わりに）
   使用して PECL から PHP OCI8 をインストールする場合、
   さらに <code class="literal">PHP_DTRACE=yes</code> を設定する必要があります。
   それは、<code class="literal">--enable-dtrace</code> オプションが、PECL バンドルの
   制限された <var class="filename">configure</var> スクリプトにより
   無視されるからです。
  </p>

  <p class="para">
   一般的な PECL インストール手順については、<a href="install.pecl.php" class="link">PECL 拡張モジュールのインストール</a>
   をご覧ください。
  </p>
 </div>

 <div class="section">
  <h2 class="title">PHP OCI8 の DTrace 静的プローブ</h2>
  <table class="doctable table">
   <caption><strong>PHP OCI8 では、以下の静的プローブが使用できます</strong></caption>
   
    <thead>
     <tr>
      <th>プローブ名</th>
      <th>プローブの説明</th>
      <th>プローブの引数</th>
     </tr>

    </thead>

    <tbody class="tbody">
     <tr>
      <td><code class="literal">oci8-connect-entry</code></td>
      <td>oci_connect()、oci_pconnect() および oci_new_connect() により開始されます。データベース接続が確立する前に発射されます。</td>
      <td>char *<var class="varname">username</var>, char *<var class="varname">dbname</var>, char *<var class="varname">charset</var>, long <var class="varname">session_mode</var>, int <var class="varname">persistent</var>, int <var class="varname">exclusive</var></td>
     </tr>

     <tr>
      <td><code class="literal">oci8-connect-return</code></td>
      <td>接続終了時に発射されます。</td>
      <td>void *<var class="varname">connection</var></td>
     </tr>

     <tr>
      <td><code class="literal">oci8-check-connection</code></td>
      <td>Oracle のエラーにより、接続が不正になったかもしれない場合に発射されます。</td>
      <td>void *<var class="varname">connection</var>, char *<var class="varname">client_id</var>, int <var class="varname">is_open</var>, long <var class="varname">errcode</var>, unsigned long <var class="varname">server_status</var></td>
     </tr>

     <tr>
      <td><code class="literal">oci8-sqltext</code></td>
      <td>oci_parse() が実行された際に発射されます。</td>
      <td>void *<var class="varname">connection</var>, char *<var class="varname">client_id</var>, void *<var class="varname">statement</var>, char *<var class="varname">sql</var></td>
     </tr>

     <tr>
      <td><code class="literal">oci8-connection-close</code></td>
      <td>データベースへの接続が完全に破壊された際に発射されます。</td>
      <td>void *<var class="varname">connection</var></td>
     </tr>

     <tr>
      <td><code class="literal">oci8-error</code></td>
      <td>Oracle のエラーが生じた場合に発射されます。</td>
      <td>int <var class="varname">status</var>, long <var class="varname">errcode</var></td>
     </tr>

     <tr>
      <td><code class="literal">oci8-execute-mode</code></td>
      <td>実行モードを示す <span class="function"><a href="function.oci-execute.php" class="function">oci_execute()</a></span> のたびに発射されます。</td>
      <td>void *<var class="varname">connection</var>, char *<var class="varname">client_id</var>, void *<var class="varname">statement</var>, unsigned int <var class="varname">mode</var></td>
     </tr>

    </tbody>
   
  </table>

  <p class="para">
   これらのプローブは、OCI8 スクリプトのトレーシングで有用です。
  </p>

  <p class="para">
   <var class="varname">connection</var> および <var class="varname">statement</var> は、
   PHP の接続および実行されたステートメントを追跡するために使用される内部構造への
   ポインタです。
  </p>

  <p class="para">
    <var class="varname">client_id</var> は、
    <span class="function"><a href="function.oci-set-client-identifier.php" class="function">oci_set_client_identifier()</a></span> により設定される値です。
  </p>

  <p class="para">
  </p>

  <p class="para">
  </p>

  <p class="para">
  </p>


  <p class="para">
   コア PHP にも静的プローブがあります。
   <a href="features.dtrace.dtrace.php#features.dtrace.static-probes" class="link">コア PHP の DTrace 静的プローブ</a>
    をご覧ください。
  </p>

  <table class="doctable table">
   <caption><strong>OCI8 の DTrace プローブ内部デバッギング</strong></caption>
   
    <thead>
     <tr>
      <th>プローブ名</th>
     </tr>

    </thead>

    <tbody class="tbody">
     <tr>
      <td><code class="literal">oci8-connect-expiry</code></td>
     </tr>

     <tr>
      <td><code class="literal">oci8-connect-lookup</code></td>
     </tr>

     <tr>
      <td><code class="literal">oci8-connect-p-dtor-close</code></td>
     </tr>

     <tr>
      <td><code class="literal">oci8-connect-p-dtor-release</code></td>
     </tr>

     <tr>
      <td><code class="literal">oci8-connect-type</code></td>
     </tr>

     <tr>
      <td><code class="literal">oci8-sesspool-create</code></td>
     </tr>

     <tr>
      <td><code class="literal">oci8-sesspool-stats</code></td>
     </tr>

     <tr>
      <td><code class="literal">oci8-sesspool-type</code></td>
     </tr>

    </tbody>
   
  </table>

  <p class="para">
   これらのプローブは、OCI8 メンテナにとって有用です。
   引数およびいつ発射されるかについては、OCI8 のソースコードを参照ください。
  </p>
 </div>

 <div class="section">
  <h2 class="title">PHP OCI8 の DTrace 静的プローブ一覧</h2>
  <p class="para">
   使用できるプローブを一覧表示するには、
   PHP プロセスを開始して以下のように実行します。
   <div class="informalexample">
    <div class="example-contents">
<div class="cdata"><pre>
# dtrace -l
</pre></div>
    </div>

   </div>
  </p>
  
  <p class="para">
   出力は以下のようになります。
   <div class="informalexample">
    <div class="example-contents">
<div class="cdata"><pre>
   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
</pre></div>
    </div>

   </div>
  </p>

   <p class="para">
    PROVIDER 列の値は、<code class="literal">phpoci</code> および
    現在実行中の PHP プロセスのプロセス ID から構成されます。
   </p>

   <p class="para">
    FUNCTION 列は、各プロバイダが配置された PHP 内部の C 実装関数名を参照します。
   </p>

   <p class="para">
    PHP プロセスが実行されていない場合、PHP プローブは表示されません。
   </p>
 </div>

 <div class="section">
  <h2 class="title">PHP OCI8 についての DTrace の例</h2>
  <p class="para">
   この例では、DTrace の D スクリプト言語の基本を示します。
   <div class="example" id="example-1">
    <p><strong>例1 DTrace を使用して
    すべてのユーザーレベルの PHP OCI8 静的プローブをトレースするための
     <var class="filename">user_oci8_probes.d</var></strong></p>
    <div class="example-contents">
<div class="cdata"><pre>
#!/usr/sbin/dtrace -Zs

#pragma D option quiet

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

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

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

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

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

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

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

   </div>
  </p>

  <p class="para">
   このスクリプトは、<var class="filename">dtrace</var> に対して
   <code class="literal">-Z</code> オプションを使用します。
   それにより、実行中の PHP プロセスがない場合に実行できるようになります。
   もしこのオプションが書き落とされた場合、
   モニターされているプローブがどれも存在しないことがわかっているので、
   PHP の実行可能ファイルが実行されていない場合、
   スクリプトは即座に終了します。
  </p>

  <p class="para">
   マルチ CPU マシンでは、プローブの順序は規則的に連続して表示されないことがあります。
   これは、どの CPU がプローブを処理し、
   CPU の間をスレッドがどのように移動したかに依存します。
   プローブのタイムスタンプを表示すると、
   混乱を減らすことができます。
  </p>

  <p class="para">
   スクリプトは、PHP スクリプト実行中の期間全体にわたって、
   すべてのユーザーレベルの PHP OCI8 静的プローブ・ポイントをトレースします。
   D スクリプトを実行します。
   <div class="informalexample">
    <div class="example-contents">
<div class="cdata"><pre>
# ./user_oci8_probes.d
</pre></div>
    </div>

   </div>
  </p>

  <p class="para">
   PHP スクリプトまたはアプリケーションを実行します。
   モニタリングの D スクリプトは、各プローブが発射されるたびに
   その引数を出力します。
   例えば、テーブルを照会する単純な PHP スクリプトにより
   以下のトレース出力がもたらされるでしょう。
   <div class="informalexample">
    <div class="example-contents">
<div class="cdata"><pre>
1381794982092854582: PHP connect-entry
  credentials=&quot;hr@localhost/pdborcl&quot;
  charset=&quot;&quot;
  session_mode=0
  persistent=0
  exclusive=0
1381794982183158766: PHP oci8-connect-return
  connection=0x7f4a7907bfb8
1381794982183594576: PHP oci8-sqltext
  connection=0x7f4a7907bfb8
  client_id=&quot;Chris&quot;
  statement=0x7f4a7907c2a0
  sql=&quot;select * from employees&quot;
1381794982183783706: PHP oci8-execute-mode
  connection=0x7f4a7907bfb8
  client_id=&quot;Chris&quot;
  statement=0x7f4a7907c2a0
  mode=0x20
1381794982444344390: PHP oci8-connect-close
  connection=0x7f4a7907bfb8
</pre></div>
    </div>

   </div>
  </p>
  
  <p class="para">
   モニタリングが完了した際には、<kbd class="keycombo"><kbd class="keycap">CTRL</kbd>+<kbd class="keycap">C</kbd></kbd> を使用して
   D スクリプトを終わらせることができます。
  </p>

 </div>

 <div class="section">
  <h2 class="title">参考</h2>
  <ul class="simplelist">
   <li><a href="features.dtrace.php" class="link">DTrace 動的トレーシング</a></li>
  </ul>
 </div>

</div>
<?php manual_footer($setup); ?>