<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/features.dtrace.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'de',
  ),
  'this' => 
  array (
    0 => 'features.dtrace.dtrace.php',
    1 => 'PHP mit DTrace verwenden',
    2 => 'PHP mit DTrace verwenden',
  ),
  'up' => 
  array (
    0 => 'features.dtrace.php',
    1 => 'DTrace Dynamic Tracing (Anwendungsanalyse in Echtzeit)',
  ),
  'prev' => 
  array (
    0 => 'features.dtrace.introduction.php',
    1 => 'Einf&uuml;hrung in PHP und DTrace',
  ),
  'next' => 
  array (
    0 => 'features.dtrace.systemtap.php',
    1 => 'Verwendung von SystemTap mit statischen PHP-DTrace-Sonden',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'de',
    'path' => 'features/dtrace.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="features.dtrace.dtrace" class="sect1">
  <h2 class="title">PHP mit DTrace verwenden</h2>
  <p class="para">
   PHP kann auf Plattformen, die DTrace Dynamic Tracing unterstützen, mit
   statischen DTrace-Sonden konfiguriert werden.
  </p>

  <div class="sect2" id="features.dtrace.install">
   <h3 class="title">PHP für statische DTrace-Sonden konfigurieren</h3>

   <p class="para">
    Um die DTrace-Unterstützung des Betriebssystems zu aktivieren, siehe die
    externe plattformspezifische Dokumentation. Unter Oracle Linux muss zum
    Beispiel ein UEK3-Kernel gebootet und anschließend Folgendes ausgeführt
    werden:
    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"># modprobe fasttrap<br /># chmod 666 /dev/dtrace/helper</span></code></div>
     </div>

    </div>
   </p>
   <p class="para">
    Anstatt <code class="literal">chmod</code> zu verwenden, kann stattdessen eine
    ACL-Paketregel verwendet werden, um den Gerätezugriff auf einen bestimmten
    Benutzer zu beschränken.
   </p>

   <p class="para">
    PHP mit dem Konfigurationsparameter <code class="literal">--enable-dtrace</code>
    kompilieren:
    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"># ./configure --enable-dtrace ...<br /># make<br /># make install</span></code></div>
     </div>

    </div>
   </p>
   <p class="para">
    Dadurch werden die statischen Sonden im Kern von PHP verfügbar. Alle
    PHP-Erweiterungen, die ihre eigenen Sonden bereitstellen, müssen separat
    als dynamische Erweiterungen gebaut werden.
   </p>
   <p class="para">
    Um Sonden zu aktivieren, muss die Umgebungsvariable
    <strong class="option unknown">USE_ZEND_DTRACE=1</strong> für die PHP-Zielprozesse gesetzt werden.
   </p>
  </div>

  <div class="sect2" id="features.dtrace.static-probes">
  <h3 class="title">Statische DTrace-Sonden im Kern von PHP</h3>
  <table class="doctable table">
   <caption><strong>Die folgenden statischen Sonden stehen in PHP zur Verfügung</strong></caption>
   
    <thead>
     <tr>
      <th>Name der Probe</th>
      <th>Beschreibung der Probe</th>
      <th>Parameter der Probe</th>
     </tr>

    </thead>

    <tbody class="tbody">
     <tr>
      <td><code class="literal">request-startup</code></td>
      <td>Wird ausgelöst, wenn eine Anfrage beginnt.</td>
      <td>char *<var class="varname">file</var>, char *<var class="varname">request_uri</var>, char *<var class="varname">request_method</var></td>
     </tr>

     <tr>
      <td><code class="literal">request-shutdown</code></td>
      <td>Wird ausgelöst, wenn eine Anfrage endet.</td>
      <td>char *<var class="varname">file</var>, char *<var class="varname">request_uri</var>, char *<var class="varname">request_method</var></td>
     </tr>

     <tr>
      <td><code class="literal">compile-file-entry</code></td>
      <td>Wird ausgelöst, wenn die Kompilierung eines Skripts beginnt.</td>
      <td>char *<var class="varname">compile_file</var>, char *<var class="varname">compile_file_translated</var></td>
     </tr>

     <tr>
      <td><code class="literal">compile-file-return</code></td>
      <td>Wird ausgelöst, wenn die Kompilierung eines Skripts endet.</td>
      <td>char *<var class="varname">compile_file</var>, char *<var class="varname">compile_file_translated</var></td>
     </tr>

     <tr>
      <td><code class="literal">execute-entry</code></td>
      <td>
       Wird ausgelöst, wenn ein OpCode-Array ausgeführt wird, z. B. bei
       Funktionsaufrufen, Includes und wenn ein Generator fortfährt.
      </td>
      <td>char *<var class="varname">request_file</var>, int <var class="varname">lineno</var></td>
     </tr>

     <tr>
      <td><code class="literal">execute-return</code></td>
      <td>Wird nach der Ausführung eines OpCode-Arrays ausgelöst.</td>
      <td>char *<var class="varname">request_file</var>, int <var class="varname">lineno</var></td>
     </tr>

     <tr>
      <td><code class="literal">function-entry</code></td>
      <td>
       Wird ausgelöst, wenn die PHP-Engine in eine PHP-Funktion oder -Methode
       gelangt.
      </td>
      <td>char *<var class="varname">function_name</var>, char *<var class="varname">request_file</var>, int <var class="varname">lineno</var>, char *<var class="varname">classname</var>, char *<var class="varname">scope</var></td>
     </tr>

     <tr>
      <td><code class="literal">function-return</code></td>
      <td>
       Wird ausgelöst, wenn die PHP-Engine aus einer PHP-Funktion oder -Methode
       zurückkehrt.
      </td>
      <td>char *<var class="varname">function_name</var>, char *<var class="varname">request_file</var>, int <var class="varname">lineno</var>, char *<var class="varname">classname</var>, char *<var class="varname">scope</var></td>
     </tr>

     <tr>
      <td><code class="literal">exception-thrown</code></td>
      <td>Wird ausgelöst, wenn eine Exception ausgelöst wird.</td>
      <td>char *<var class="varname">classname</var></td>
     </tr>

     <tr>
      <td><code class="literal">exception-caught</code></td>
      <td>Wird ausgelöst, wenn eine Exception abgefangen wird.</td>
      <td>char *<var class="varname">classname</var></td>
     </tr>

     <tr>
      <td><code class="literal">error</code></td>
      <td>
       Wird ausgelöst, wenn ein Fehler auftritt, unabhängig von der
       <a href="errorfunc.configuration.php#ini.error-reporting" class="link">error_reporting</a>-Stufe.
      </td>
      <td>char *<var class="varname">errormsg</var>, char *<var class="varname">request_file</var>, int <var class="varname">lineno</var></td>
     </tr>

    </tbody>
   
  </table>

  <p class="para">
   PHP-Erweiterungen verfügen möglicherweise über zusätzliche statische Sonden.
  </p>
  </div>

  <div class="sect2" id="features.dtrace.list-probes">
   <h3 class="title">Liste statischer DTrace-Sonden in PHP</h3>
   <p class="para">
    Um die verfügbaren Sonden aufzulisten, ist es nötig, einen PHP-Prozess zu
    starten und dann Folgendes auszuführen:
    <div class="informalexample">
     <div class="example-contents">
<div class="cdata"><pre>
# dtrace -l
</pre></div>
     </div>

    </div>
   </p>

   <p class="para">
    Die Ausgabe wird ungefähr so aussehen:
    <div class="informalexample">
     <div class="example-contents">
<div class="cdata"><pre>
   ID   PROVIDER            MODULE                          FUNCTION NAME
   [ . . . ]
    4   php15271               php               dtrace_compile_file compile-file-entry
    5   php15271               php               dtrace_compile_file compile-file-return
    6   php15271               php                        zend_error error
    7   php15271               php  ZEND_CATCH_SPEC_CONST_CV_HANDLER exception-caught
    8   php15271               php     zend_throw_exception_internal exception-thrown
    9   php15271               php                 dtrace_execute_ex execute-entry
   10   php15271               php           dtrace_execute_internal execute-entry
   11   php15271               php                 dtrace_execute_ex execute-return
   12   php15271               php           dtrace_execute_internal execute-return
   13   php15271               php                 dtrace_execute_ex function-entry
   14   php15271               php                 dtrace_execute_ex function-return
   15   php15271               php              php_request_shutdown request-shutdown
   16   php15271               php               php_request_startup request-startup
</pre></div>
     </div>

    </div>
   </p>

   <p class="para">
    Die Werte der Spalte PROVIDER setzen sich aus <code class="literal">php</code> und
    der Prozess-ID des aktuell laufenden PHP-Prozesses zusammen.
   </p>

   <p class="para">
    Wenn der Apache-Webserver läuft, könnte der Modulname zum Beispiel
    <var class="filename">libphp5.so</var> sein, und es gäbe pro laufendem
    Apache-Prozess einen Auflistungs-Block.
   </p>

   <p class="para">
    Die Spalte FUNCTION verweist auf den Funktionsnamen der PHP-internen
    C-Implementierung, in der sich der jeweilige Provider befindet.
   </p>

   <p class="para">
    Wenn kein PHP-Prozess läuft, werden auch keine PHP-Sonden angezeigt.
   </p>
  </div>

  <div class="sect2" id="features.dtrace.examples">
   <h3 class="title">DTrace-Beispiel für PHP</h3>
   <p class="para">
    Dieses Beispiel zeigt die grundlegenden Möglichkeiten der
    DTrace-Skriptsprache D.
    <div class="example" id="example-1">
     <p><strong>Beispiel #1 <var class="filename">all_probes.d</var> für die Verfolgung aller statischen PHP-Sonden mit DTrace</strong></p>
     <div class="example-contents">
<div class="cdata"><pre>
#!/usr/sbin/dtrace -Zs

#pragma D option quiet

php*:::compile-file-entry
{
    printf(&quot;PHP compile-file-entry\n&quot;);
    printf(&quot;  compile_file              %s\n&quot;, copyinstr(arg0));
    printf(&quot;  compile_file_translated   %s\n&quot;, copyinstr(arg1));
}

php*:::compile-file-return
{
    printf(&quot;PHP compile-file-return\n&quot;);
    printf(&quot;  compile_file              %s\n&quot;, copyinstr(arg0));
    printf(&quot;  compile_file_translated   %s\n&quot;, copyinstr(arg1));
}

php*:::error
{
    printf(&quot;PHP error\n&quot;);
    printf(&quot;  errormsg                  %s\n&quot;, copyinstr(arg0));
    printf(&quot;  request_file              %s\n&quot;, copyinstr(arg1));
    printf(&quot;  lineno                    %d\n&quot;, (int)arg2);
}

php*:::exception-caught
{
    printf(&quot;PHP exception-caught\n&quot;);
    printf(&quot;  classname                 %s\n&quot;, copyinstr(arg0));
}

php*:::exception-thrown
{
    printf(&quot;PHP exception-thrown\n&quot;);
    printf(&quot;  classname                 %s\n&quot;, copyinstr(arg0));
}

php*:::execute-entry
{
    printf(&quot;PHP execute-entry\n&quot;);
    printf(&quot;  request_file              %s\n&quot;, copyinstr(arg0));
    printf(&quot;  lineno                    %d\n&quot;, (int)arg1);
}

php*:::execute-return
{
    printf(&quot;PHP execute-return\n&quot;);
    printf(&quot;  request_file              %s\n&quot;, copyinstr(arg0));
    printf(&quot;  lineno                    %d\n&quot;, (int)arg1);
}

php*:::function-entry
{
    printf(&quot;PHP function-entry\n&quot;);
    printf(&quot;  function_name             %s\n&quot;, copyinstr(arg0));
    printf(&quot;  request_file              %s\n&quot;, copyinstr(arg1));
    printf(&quot;  lineno                    %d\n&quot;, (int)arg2);
    printf(&quot;  classname                 %s\n&quot;, copyinstr(arg3));
    printf(&quot;  scope                     %s\n&quot;, copyinstr(arg4));
}

php*:::function-return
{
    printf(&quot;PHP function-return\n&quot;);
    printf(&quot;  function_name             %s\n&quot;, copyinstr(arg0));
    printf(&quot;  request_file              %s\n&quot;, copyinstr(arg1));
    printf(&quot;  lineno                    %d\n&quot;, (int)arg2);
    printf(&quot;  classname                 %s\n&quot;, copyinstr(arg3));
    printf(&quot;  scope                     %s\n&quot;, copyinstr(arg4));
}

php*:::request-shutdown
{
    printf(&quot;PHP request-shutdown\n&quot;);
    printf(&quot;  file                      %s\n&quot;, copyinstr(arg0));
    printf(&quot;  request_uri               %s\n&quot;, copyinstr(arg1));
    printf(&quot;  request_method            %s\n&quot;, copyinstr(arg2));
}

php*:::request-startup
{
    printf(&quot;PHP request-startup\n&quot;);
    printf(&quot;  file                      %s\n&quot;, copyinstr(arg0));
    printf(&quot;  request_uri               %s\n&quot;, copyinstr(arg1));
    printf(&quot;  request_method            %s\n&quot;, copyinstr(arg2));
}
</pre></div>
     </div>

    </div>
   </p>

   <p class="para">
    Dieses Skript verwendet <var class="filename">dtrace</var> mit der Option
    <code class="literal">-Z</code>, damit es auch dann ausgeführt werden kann, wenn
    gerade kein PHP-Prozess läuft. Ohne diese Option würde das Skript sofort
    beendet, weil es erkennt, dass keine der zu überwachenden Sonden vorhanden
    ist.
   </p>

   <p class="para">
    Das Skript verfolgt während der gesamten Zeit, in der ein PHP-Skript
    läuft, alle statischen Sondenpunkte des PHP-Kerns.
    <div class="informalexample">
     <div class="example-contents">
<div class="cdata"><pre>
# ./all_probes.d
</pre></div>
     </div>

    </div>
   </p>

   <p class="para">
    Sobald nun ein PHP-Skript oder eine Anwendung ausgeführt wird, beginnt das
    überwachende D-Skript, alle Parameter der ausgelösten Sonden auszugeben.
   </p>

   <p class="para">
    Um die Überwachung abzuschließen, kann das D-Skript mittels
    <kbd class="keycombo"><kbd class="keycap">CTRL</kbd>+<kbd class="keycap">C</kbd></kbd>
    beendet werden.
   </p>

   <p class="para">
    Auf Rechnern mit mehreren CPUs ist die Reihenfolge der Tests möglicherweise
    nicht sequentiell. Dies hängt davon ab, welche CPU die Sonden verarbeitet
    hat und wie die Threads zwischen den CPUs wechseln. Die Anzeige der
    Zeitstempel der Sonden hilft, Verwechslungen zu vermeiden, zum Beispiel:
    <div class="informalexample">
     <div class="example-contents">
<div class="cdata"><pre>
php*:::function-entry
{
      printf(&quot;%lld: PHP function-entry &quot;, walltimestamp);
      [ . . .]
}
</pre></div>
     </div>

    </div>
   </p>
  </div>

  <div class="sect2" id="features.dtrace.references">
   <h3 class="title">Siehe auch</h3>
   <ul class="simplelist">
    <li><a href="oci8.dtrace.php" class="link">OCI8 und DTrace Dynamic Tracing</a></li>
   </ul>
  </div>
 </div><?php manual_footer($setup); ?>