Інтерактивний покроковий налагоджувач PHP, реалізований як модуль SAPI, може давати вам повний контроль над навколишнім середовищем, не впливаючи на функціональність або продуктивність вашого коду. Він має на меті бути легкою, потужною, простою у користуванні платформою для налагодження для PHP 5.4+ і постачається нестандартно з PHP 5.6.
Особливості включають:
- Покрокова налагодження
- Гнучкі точки перерви (метод класу, функція, файл: рядок, адреса, код коду)
- Легкий доступ до PHP за допомогою вбудованого eval ()
- Легкий доступ до виконуваного в даний час коду
- API Userland
- SAPI Agnostic - легко інтегрується
- Підтримка файлу конфігурації PHP
- JIT Super Globals - Установіть власні !!
- Необов'язкова підтримка лінії перегляду - Зручна експлуатація терміналу
- Підтримка віддаленої налагодження - пакетний графічний інтерфейс Java
- Простота експлуатації
Дивіться скріншоти:
Головна сторінка: 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-lamp у GitHub
Ось просте використання:
- Run:
sudo dtruss-php.d
.
- На іншому терміналі виконайте:
php -r "phpinfo();"
.
Щоб перевірити це, ви можете перейти до будь-якої docroot із 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 на php.net