Utiliser PHP et DTrace

PHP peut ĂȘtre configurĂ© avec les sondes statiques DTrace sur les plateformes qui supportent le traçage dynamique DTrace.

Configurer PHP pour les sondes statiques de DTrace

Se référer à la documentation spécifique de la plateforme externe pour activer le support DTrace du systÚme d'exploitation. Par exemple, sur Oracle Linux démarrez un noyau UEK3 et faites :

# modprobe fasttrap
# chmod 666 /dev/dtrace/helper

Au lieu d'utiliser chmod, il est possible d'utiliser une rÚgle de paquetage ACL pour limiter l'accÚs au périphérique à un utilisateur spécifique.

Construire PHP avec le paramĂštre de configuration --enable-dtrace:

# ./configure --enable-dtrace ...
# make
# make install

Cela rend les sondes statiques disponibles dans le cƓur de PHP. Toutes les extensions PHP qui fournissent leurs propres sondes doivent ĂȘtre construites sĂ©parĂ©ment en tant qu'extensions partagĂ©es.

Pour activer les sondes, définissez la variable d'environnement USE_ZEND_DTRACE=1 pour les processus PHP ciblés.

Sondes statiques DTrace dans le cƓur de PHP

Les sondes statiques suivantes sont disponibles dans PHP
Nom de la sonde Description de la sonde Arguments de la sonde
request-startup Se dĂ©clenche lorsqu'une requĂȘte dĂ©marre. char *file, char *request_uri, char *request_method
request-shutdown Se dĂ©clenche lorsqu'une requĂȘte s'arrĂȘte. char *file, char *request_uri, char *request_method
compile-file-entry Se déclenche lorsque la compilation d'un script commence. char *compile_file, char *compile_file_translated
compile-file-return Se déclenche lorsque la compilation d'un script se termine. char *compile_file, char *compile_file_translated
execute-entry Se dĂ©clenche lorsqu'un tableau d'opcodes doit ĂȘtre exĂ©cutĂ©. Par exemple, il se dĂ©clenche lors d'appels de fonction, d'inclusions et de reprises de gĂ©nĂ©rateur. char *request_file, int lineno
execute-return Se déclenche aprÚs l'exécution d'un tableau d'opcodes. char *request_file, int lineno
function-entry Se déclenche lorsque le moteur de PHP entre dans une fonction PHP ou un appel de méthode. char *function_name, char *request_file, int lineno, char *classname, char *scope
function-return Se déclenche lorsque le moteur PHP revient d'une fonction PHP ou d'un appel de méthode. char *function_name, char *request_file, int lineno, char *classname, char *scope
exception-thrown Se déclenche lorsqu'une exception est émise. char *classname
exception-caught Se déclenche lorsqu'une exception est attrapée. char *classname
error Se déclenche lorsqu'une erreur survient, quel que soit le niveau de error_reporting. char *errormsg, char *request_file, int lineno

Les extensions PHP peuvent également disposer de sondes statiques supplémentaires.

Liste des sondes statiques DTrace de PHP

Pour lister les sondes disponibles, démarrez un processus PHP puis exécutez :

# dtrace -l

Le résultat sera similaire à celui qui suit :

   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

Les valeurs de la colonne Provider sont php et l'identifiant du processus PHP en cours d'exécution.

Si le serveur web Apache est en cours d'exĂ©cution, le nom du module peut ĂȘtre, par exemple, libphp5.so, et il y aurait plusieurs blocs de listes, un par processus Apache en cours d'exĂ©cution.

La colonne Fonction fait rĂ©fĂ©rence Ă  l'implĂ©mentation interne en C de PHP, oĂč chaque fournisseur est situĂ©.

Si un processus PHP n'est pas en cours d'exécution, aucune sonde PHP ne sera affichée.

DTrace avec un exemple PHP

Cet exemple montre les bases du langage de script DTrace D.

Exemple #1 all_probes.d pour tracer toutes les sondes statiques PHP avec DTrace

#!/usr/sbin/dtrace -Zs

#pragma D option quiet

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

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

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

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

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

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

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

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

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

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

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

Ce script utilise l'option -Z de dtrace, ce qui lui permet d'ĂȘtre exĂ©cutĂ© lorsqu'il n'y a aucun processus PHP en cours d'exĂ©cution. Si cette option Ă©tait omise, le script se terminerait immĂ©diatement parce qu'il sait qu'aucune des sondes Ă  surveiller n'existe.

Le script trace tous les points de sonde statiques de PHP pendant la durée d'un script PHP en cours d'exécution. Exécutez le script D :

# ./all_probes.d

Exécutez un script ou une application PHP. Le script D de surveillance affichera les arguments de chaque sonde au fur et à mesure qu'elle se déclenche.

Lorsque la surveillance est terminĂ©e, le script D peut ĂȘtre interrompu par une commande CTRL+C

Sur les machines multi-CPU, l'ordre des sondes peut ne pas ĂȘtre sĂ©quentiel. Cela dĂ©pend du CPU qui a traitĂ© les sondes, et de la façon dont les threads migrent d'un CPU Ă  l'autre. L'affichage des horodatages des sondes permet de rĂ©duire la confusion, par exemple :

php*:::function-entry
{
      printf("%lld: PHP function-entry ", walltimestamp);
      [ . . .]
}
add a note

User Contributed Notes

There are no user contributed notes for this page.