Interactive Stepthrough PHP Debugger implementato come un modulo SAPI che può darti il controllo completo sull'ambiente senza influire sulla funzionalità o sulle prestazioni del tuo codice. Mira a essere una piattaforma di debug leggera, potente e facile da usare per PHP 5.4+ ed è spedita immediatamente con PHP 5.6.
Le caratteristiche includono:
- Debug dettagliato
- Breakpoint flessibili (metodo di classe, funzione, file: linea, indirizzo, codice operativo)
- Facile accesso a PHP con eval () integrato
- Facile accesso al codice attualmente in esecuzione
- API Userland
- SAPI Agnostic - Facilmente integrato
- Supporto file di configurazione PHP
- JIT Super Globals - Crea il tuo !!
- Supporto readline opzionale - Comodo funzionamento del terminale
- Supporto per il debug remoto - GUI Java in bundle
- Funzionamento facile
Vedi gli screenshot:
Home page: http://phpdbg.com/
Errore PHP - Migliore segnalazione degli errori per PHP
Questa è una libreria molto facile da usare (in realtà un file) per eseguire il debug degli script PHP.
L'unica cosa che devi fare è includere un file come di seguito (all'inizio sul tuo codice):
require('php_error.php');
\php_error\reportErrors();
Quindi tutti gli errori ti forniranno informazioni come backtrace, contesto di codice, argomenti di funzione, variabili del server, ecc. Ad esempio:
Le caratteristiche includono:
- banale da usare, è solo un file
- errori visualizzati nel browser per richieste normali e ajaxy
- Le richieste AJAX vengono messe in pausa, consentendoti di rieseguirle automaticamente
- rende gli errori il più rigorosi possibile (incoraggia la qualità del codice e tende a migliorare le prestazioni)
- frammenti di codice nell'intera traccia dello stack
- fornisce ulteriori informazioni (come firme di funzioni complete)
- corregge alcuni messaggi di errore che sono semplicemente sbagliati
- evidenziazione della sintassi
- sembra carino!
- personalizzazione
- accenderlo e spegnerlo manualmente
- eseguire sezioni specifiche senza segnalazione errori
- ignora i file che ti consentono di evitare di evidenziare il codice nella traccia dello stack
- file dell'applicazione; questi hanno la priorità quando si verifica un errore!
Home page: http://phperror.net/
GitHub: https://github.com/JosephLenton/PHP-Error
Il mio fork (con correzioni extra): https://github.com/kenorb-contrib/PHP-Error
Se il tuo sistema supporta la traccia dinamica DTrace (installata di default su OS X) e il tuo PHP è compilato con le sonde DTrace abilitate ( --enable-dtrace
) che dovrebbero essere di default, questo comando può aiutarti a eseguire il debug dello script PHP senza tempo:
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); }'
Quindi dato il seguente alias è stato aggiunto ai tuoi file rc (ad es ~/.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); }"'
si può tracciare lo script con facile da ricordare alias: trace-php
.
Ecco uno script dtrace più avanzato, salvalo in, rendilo dtruss-php.d
eseguibile ( chmod +x dtruss-php.d
) ed esegui:
#!/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));
}
Home page: lampada dtruss su GitHub
Ecco un semplice utilizzo:
- Run:
sudo dtruss-php.d
.
- Su un altro terminale eseguire:
php -r "phpinfo();"
.
Per verificarlo, puoi andare su qualsiasi docroot con index.php
ed eseguire il server integrato PHP:
php -S localhost:8080
Dopodiché puoi accedere al sito all'indirizzo http: // localhost: 8080 / (o scegliere la porta più adatta a te). Da lì accedi ad alcune pagine per vedere l'output della traccia.
Nota: Dtrace è disponibile su OS X per impostazione predefinita, su Linux probabilmente hai bisogno di dtrace4linux o cerca altre alternative .
Vedi: Utilizzo di PHP e DTrace su php.net
In alternativa, verificare la traccia di SystemTap installando il pacchetto di sviluppo SDT di SystemTap (ad es yum install systemtap-sdt-devel
.).
Ecco un esempio di script ( all_probes.stp
) per tracciare tutti i punti del probe statico PHP di base per tutta la durata di uno script PHP in esecuzione 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
Vedi: Uso di SystemTap con le sonde statiche DTrace PHP su php.net