Интерактивный пошаговый отладчик PHP, реализованный в виде модуля SAPI, который может дать вам полный контроль над средой, не влияя на функциональность или производительность вашего кода. Он нацелен на то, чтобы стать легкой, мощной и простой в использовании платформой отладки для PHP 5.4+ и поставляется из коробки с PHP 5.6.
Особенности включают в себя:
- Пошаговая отладка
- Гибкие точки останова (метод класса, функция, файл: строка, адрес, код операции)
- Простой доступ к PHP со встроенным eval ()
- Легкий доступ к исполняемому в настоящее время коду
- Пользовательский API
- SAPI Agnostic - легко интегрируется
- Поддержка файла конфигурации PHP
- JIT Super Globals - создай свой собственный!
- Дополнительная поддержка readline - удобная работа терминала
- Поддержка удаленной отладки - Java GUI в комплекте
- Простота в эксплуатации
Смотрите скриншоты:
Домашняя страница: http://phpdbg.com/
Ошибка PHP - Лучшая отчетность об ошибках для PHP
Это очень простая в использовании библиотека (фактически файл) для отладки ваших PHP-скриптов.
Единственное, что вам нужно сделать, это включить один файл, как показано ниже (в начале вашего кода):
require('php_error.php');
\php_error\reportErrors();
Тогда все ошибки будут давать вам такую информацию, как обратная трассировка, контекст кода, аргументы функции, переменные сервера и т. Д. Например:
Особенности включают в себя:
- тривиально использовать, это всего лишь один файл
- ошибки, отображаемые в браузере для обычных запросов и запросов ajaxy
- AJAX-запросы приостановлены, что позволяет автоматически перезапускать их
- делает ошибки максимально строгими (повышает качество кода и повышает производительность)
- фрагменты кода по всей трассировке стека
- предоставляет больше информации (например, полнофункциональные подписи)
- исправляет некоторые сообщения об ошибках, которые просто неправильно
- подсветка синтаксиса
- выглядит довольно!
- настройка
- вручную включить и выключить
- запускать определенные разделы без сообщений об ошибках
- игнорировать файлы, позволяющие избежать выделения кода в трассировке стека
- файлы приложений; они имеют приоритет при возникновении ошибки!
Домашняя страница: http://phperror.net/
GitHub: https://github.com/JosephLenton/PHP-Error
Мой форк (с дополнительными исправлениями): https://github.com/kenorb-contrib/PHP-Error
Если ваша система поддерживает динамическую трассировку DTrace (установленную по умолчанию в OS X) и ваш PHP скомпилирован с включенными датчиками DTrace ( --enable-dtrace
), что должно быть по умолчанию, эта команда может помочь вам без промедления отладить сценарий 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); }'
Поэтому, учитывая, что в ваши rc- файлы был добавлен следующий псевдоним (например ~/.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); }"'
Вы можете отслеживать ваш скрипт с легко запоминаемым псевдонимом: trace-php
.
Вот более продвинутый сценарий dtrace, просто сохраните его dtruss-php.d
, сделайте его исполняемым ( chmod +x dtruss-php.d
) и запустите:
#!/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));
}
Домашняя страница: лампа dtruss на GitHub
Вот простое использование:
- Run:
sudo dtruss-php.d
.
- На другом терминале выполните:
php -r "phpinfo();"
.
Чтобы проверить это, вы можете перейти к любому документу index.php
и запустить встроенный сервер PHP:
php -S localhost:8080
После этого вы можете зайти на сайт по адресу http: // localhost: 8080 / (или выбрать любой удобный для вас порт). Оттуда перейдите на несколько страниц, чтобы увидеть результаты трассировки.
Примечание: Dtrace доступен в OS X по умолчанию, в Linux вам, вероятно, нужен dtrace4linux или проверьте другие альтернативы .
Смотрите: Использование PHP и DTrace на php.net
Или проверьте трассировку SystemTap, установив пакет разработки SystemTap SDT (например yum install systemtap-sdt-devel
).
Вот пример script ( all_probes.stp
) для отслеживания всех основных статических точек проверки PHP в течение всего времени выполнения сценария PHP с 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));
}
Применение:
stap -c 'sapi/cli/php test.php' all_probes.stp
Смотрите: Использование SystemTap с PHP DTrace Static Probes на php.net