Après APC (Alternative PHP Cache), voici APD (Advanced PHP Debugger). Cet outil n'est pas un debugger interactif comme il en existe déjà (on peut citer DBG par exemple). Mais il se rapproche plutôt d'outils comme strace ou encore truss, connus des développeurs Unix. A ce titre, APD permet de récuppérer dans un fichier de logs (de traces) une foultitude d'évenements comme les appels aux fonctions, les passages d'arguments ou encore les temps d'exécution.

APD se présente comme une extension Zend. Après l'étape de compilation (un simple ./configure a suffit pour moi), il reste à paramétrer le php.ini afin d'embarquer cette nouvelle extension.

; activation de l'extension
zend_extension=/chemin/vers/php_apd.so
; paramétrage du chemin de sauvegarde des logs
apd.dumpdir=/chemin/vers/tracedump/
Ensuite, afin d'invoquer l'appel à APD (qui restera muet par défaut), vous devez utiliser dans vos scripts la fonction apd_set_session_trace(N).

La valeur N est une combinaison de :

#define FUNCTION_TRACE 1
#define ARGS_TRACE 2
#define ASSIGNMENT_TRACE 4
#define STATEMENT_TRACE 8
#define MEMORY_TRACE 16
#define TIMING_TRACE 32
Par exemple afin d'activer les traces sur les temps d'execution, les fonctions et les passages d'arguments, il vous suffira d'insérer la ligne apd_set_session_trace(35) dans le script que vous souhaitez tracer.

Voici un exemple de trace proposé sur le site d'APD :

16:37:51(george@wasabi)[~/src/apd]> cat /tmp/apd_dump_31994

APD - Advanced PHP Debugger Trace File
-------------------------------------------------------
Process Pid (31994)
Trace Begun at Fri Aug 10 16:37:45 2001
-------------------------------------------------------
( 0.000000): apd_set_session_trace called at somewhere
( 0.001482): apd_set_session_trace() returned. Elapsed (997475865.364909)
( 0.001563): getcwd() /opt/apache/htdocs/a.php:4
( 0.001628): getcwd() returned. Elapsed (0.000065)
( 0.001819): require() /opt/apache/htdocs/a.php:6
++ argv[0] $(??) = /tmp/a.php
( 0.002231): getcwd() /tmp/a.php:3
( 0.002290): getcwd() returned. Elapsed (0.000059)
( 0.002375): include_once() /tmp/a.php:4
++ argv[0] $(??) = /tmp/aa.php
( 0.003276): include_once() returned. Elapsed (0.000901)
( 0.003334): require() returned. Elapsed (0.001515)
( 0.003381): require_once() /opt/apache/htdocs/a.php:7
++ argv[0] $(??) = /tmp/aa.php
( 0.003515): require_once() returned. Elapsed (0.000134)
( 0.003564): include() /opt/apache/htdocs/a.php:8
++ argv[0] $(??) = /tmp/b.php
( 0.003792): include() returned. Elapsed (0.000228)
( 0.018341): RSHUTDOWN called - end of trace
-------------------------------------------------------
Process Pid (31994)
Trace Ended at Fri Aug 10 16:37:45 2001
-------------------------------------------------------
APD propose aussi d'autres fonctions comme, par exemple, apd_callstack() qui permet de dumper la pile à tout instant.

APD n'est donc pas un debuggeur comme les autres. Mais il peut s'avérer bien utile et parfaitement complémentaire des solutions déjà existantes.

Rappelons qu'APD est encore en phase de développement (version 0.1), et qu'il peut s'avérer incompatible avec d'autres extensions. Enfin, précisons qu'APD est distribué sous licence QPL.

APD
APC
DBG