El Depurador PHP interactivo paso a paso implementado como un módulo SAPI que puede brindarle un control completo sobre el entorno sin afectar la funcionalidad o el rendimiento de su código. Su objetivo es ser una plataforma de depuración ligera, potente y fácil de usar para PHP 5.4+ y se envía de fábrica con PHP 5.6.
Las características incluyen:
- Depuración paso a paso
- Puntos de interrupción flexibles (método de clase, función, archivo: línea, dirección, código de operación)
- Fácil acceso a PHP con eval () incorporado
- Fácil acceso al código actualmente en ejecución
- API de usuario
- SAPI Agnostic - Fácilmente integrado
- Soporte de archivos de configuración de PHP
- JIT Super Globals - ¡¡Establezca la suya !!
- Soporte opcional de readline - Operación de terminal cómoda
- Soporte de depuración remota: paquete de GUI de Java
- Operación fácil
Ver las capturas de pantalla:
Página de inicio: http://phpdbg.com/
Error de PHP : mejor informe de errores para PHP
Esta es una biblioteca muy fácil de usar (en realidad un archivo) para depurar sus scripts PHP.
Lo único que debe hacer es incluir un archivo como se muestra a continuación (al principio en su código):
require('php_error.php');
\php_error\reportErrors();
Luego, todos los errores le darán información como traza inversa, contexto de código, argumentos de función, variables de servidor, etc. Por ejemplo:
Las características incluyen:
- trivial de usar, es solo un archivo
- errores mostrados en el navegador para solicitudes normales y ajaxy
- Las solicitudes de AJAX están en pausa, lo que le permite volver a ejecutarlas automáticamente
- comete errores lo más estrictos posible (fomenta la calidad del código y tiende a mejorar el rendimiento)
- fragmentos de código en todo el seguimiento de la pila
- proporciona más información (como firmas de funciones completas)
- corrige algunos mensajes de error que simplemente son incorrectos
- resaltado de sintaxis
- ¡se ve hermosa!
- personalización
- encenderlo y apagarlo manualmente
- ejecutar secciones específicas sin informe de errores
- ignore los archivos que le permiten evitar resaltar el código en su seguimiento de pila
- archivos de aplicación; ¡estos tienen prioridad cuando se produce un error!
Página de inicio: http://phperror.net/
GitHub: https://github.com/JosephLenton/PHP-Error
Mi tenedor (con correcciones adicionales): https://github.com/kenorb-contrib/PHP-Error
Si su sistema admite el seguimiento dinámico de DTrace (instalado de forma predeterminada en OS X) y su PHP está compilado con las sondas DTrace habilitadas ( --enable-dtrace
), que debería estar por defecto, este comando puede ayudarlo a depurar el script PHP sin tiempo:
sudo dtrace -qn 'php*:::function-entry { printf("%Y: PHP function-entry:\t%s%s%s() in %s:%d\n", walltimestamp, copyinstr(arg3), copyinstr(arg4), copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2); }'
Entonces, dado el siguiente alias se ha agregado a sus archivos rc (por ejemplo ~/.bashrc
, ~/.bash_aliases
):
alias trace-php='sudo dtrace -qn "php*:::function-entry { printf(\"%Y: PHP function-entry:\t%s%s%s() in %s:%d\n\", walltimestamp, copyinstr(arg3), copyinstr(arg4), copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2); }"'
es posible trazar la secuencia de comandos con alias fácil de recordar: trace-php
.
Aquí hay un script dtrace más avanzado, solo guárdelo, hágalo dtruss-php.d
ejecutable ( chmod +x dtruss-php.d
) y ejecute:
#!/usr/sbin/dtrace -Zs
# See: https://github.com/kenorb/dtruss-lamp/blob/master/dtruss-php.d
#pragma D option quiet
php*:::compile-file-entry
{
printf("%Y: PHP compile-file-entry:\t%s (%s)\n", walltimestamp, basename(copyinstr(arg0)), copyinstr(arg1));
}
php*:::compile-file-return
{
printf("%Y: PHP compile-file-return:\t%s (%s)\n", walltimestamp, basename(copyinstr(arg0)), basename(copyinstr(arg1)));
}
php*:::error
{
printf("%Y: PHP error message:\t%s in %s:%d\n", walltimestamp, copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2);
}
php*:::exception-caught
{
printf("%Y: PHP exception-caught:\t%s\n", walltimestamp, copyinstr(arg0));
}
php*:::exception-thrown
{
printf("%Y: PHP exception-thrown:\t%s\n", walltimestamp, copyinstr(arg0));
}
php*:::execute-entry
{
printf("%Y: PHP execute-entry:\t%s:%d\n", walltimestamp, basename(copyinstr(arg0)), (int)arg1);
}
php*:::execute-return
{
printf("%Y: PHP execute-return:\t%s:%d\n", walltimestamp, basename(copyinstr(arg0)), (int)arg1);
}
php*:::function-entry
{
printf("%Y: PHP function-entry:\t%s%s%s() in %s:%d\n", walltimestamp, copyinstr(arg3), copyinstr(arg4), copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2);
}
php*:::function-return
{
printf("%Y: PHP function-return:\t%s%s%s() in %s:%d\n", walltimestamp, copyinstr(arg3), copyinstr(arg4), copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2);
}
php*:::request-shutdown
{
printf("%Y: PHP request-shutdown:\t%s at %s via %s\n", walltimestamp, basename(copyinstr(arg0)), copyinstr(arg1), copyinstr(arg2));
}
php*:::request-startup
{
printf("%Y, PHP request-startup:\t%s at %s via %s\n", walltimestamp, basename(copyinstr(arg0)), copyinstr(arg1), copyinstr(arg2));
}
Página de inicio: lámpara dtruss en GitHub
Aquí hay un uso simple:
- Ejecute:
sudo dtruss-php.d
.
- En otro terminal ejecutar:
php -r "phpinfo();"
.
Para probar eso, puede ir a cualquier docroot con index.php
y ejecutar el servidor integrado PHP mediante:
php -S localhost:8080
Después de eso, puede acceder al sitio en http: // localhost: 8080 / (o elegir el puerto que sea conveniente para usted). Desde allí, acceda a algunas páginas para ver la salida de seguimiento.
Nota: Dtrace está disponible en OS X de manera predeterminada, en Linux probablemente necesite dtrace4linux o busque otras alternativas .
Consulte: Uso de PHP y DTrace en php.net
Alternativamente, compruebe el seguimiento de SystemTap instalando el paquete de desarrollo SystemTap SDT (por ejemplo yum install systemtap-sdt-devel
)
Aquí hay un script de ejemplo ( all_probes.stp
) para rastrear todos los puntos centrales de la sonda estática PHP durante la duración de un script PHP en ejecución con SystemTap:
probe process("sapi/cli/php").provider("php").mark("compile__file__entry") {
printf("Probe compile__file__entry\n");
printf(" compile_file %s\n", user_string($arg1));
printf(" compile_file_translated %s\n", user_string($arg2));
}
probe process("sapi/cli/php").provider("php").mark("compile__file__return") {
printf("Probe compile__file__return\n");
printf(" compile_file %s\n", user_string($arg1));
printf(" compile_file_translated %s\n", user_string($arg2));
}
probe process("sapi/cli/php").provider("php").mark("error") {
printf("Probe error\n");
printf(" errormsg %s\n", user_string($arg1));
printf(" request_file %s\n", user_string($arg2));
printf(" lineno %d\n", $arg3);
}
probe process("sapi/cli/php").provider("php").mark("exception__caught") {
printf("Probe exception__caught\n");
printf(" classname %s\n", user_string($arg1));
}
probe process("sapi/cli/php").provider("php").mark("exception__thrown") {
printf("Probe exception__thrown\n");
printf(" classname %s\n", user_string($arg1));
}
probe process("sapi/cli/php").provider("php").mark("execute__entry") {
printf("Probe execute__entry\n");
printf(" request_file %s\n", user_string($arg1));
printf(" lineno %d\n", $arg2);
}
probe process("sapi/cli/php").provider("php").mark("execute__return") {
printf("Probe execute__return\n");
printf(" request_file %s\n", user_string($arg1));
printf(" lineno %d\n", $arg2);
}
probe process("sapi/cli/php").provider("php").mark("function__entry") {
printf("Probe function__entry\n");
printf(" function_name %s\n", user_string($arg1));
printf(" request_file %s\n", user_string($arg2));
printf(" lineno %d\n", $arg3);
printf(" classname %s\n", user_string($arg4));
printf(" scope %s\n", user_string($arg5));
}
probe process("sapi/cli/php").provider("php").mark("function__return") {
printf("Probe function__return: %s\n", user_string($arg1));
printf(" function_name %s\n", user_string($arg1));
printf(" request_file %s\n", user_string($arg2));
printf(" lineno %d\n", $arg3);
printf(" classname %s\n", user_string($arg4));
printf(" scope %s\n", user_string($arg5));
}
probe process("sapi/cli/php").provider("php").mark("request__shutdown") {
printf("Probe request__shutdown\n");
printf(" file %s\n", user_string($arg1));
printf(" request_uri %s\n", user_string($arg2));
printf(" request_method %s\n", user_string($arg3));
}
probe process("sapi/cli/php").provider("php").mark("request__startup") {
printf("Probe request__startup\n");
printf(" file %s\n", user_string($arg1));
printf(" request_uri %s\n", user_string($arg2));
printf(" request_method %s\n", user_string($arg3));
}
Uso:
stap -c 'sapi/cli/php test.php' all_probes.stp
Consulte: Uso de SystemTap con sondas estáticas DTrace de PHP en php.net