Как вы отлаживаете PHP-скрипты? [закрыто]


Как вы отлаживаете PHP скрипты?

Я знаю об основной отладке, такой как использование отчетов об ошибках. Отладка точки останова в PHPEclipse также весьма полезна.

Какой лучший (с точки зрения быстрого и простого) способ отладки в PhpStorm или любой другой IDE?

Author: Andrey Adamovich, 2008-08-04

30 answers

Попробуйте Eclipse PDT настроить среду Eclipse с функциями отладки, как вы упомянули. Возможность войти в код - гораздо лучший способ отладки, чем старый метод var_dump, и печатать в разных точках, чтобы увидеть, где ваш поток идет не так. Когда все остальное терпит неудачу, и все, что у меня есть, это SSH и vim, я все еще var_dump()/die() чтобы найти, где код идет на юг.

 145
Author: John Downey, 2016-03-02 05:37:24

Вы можете использовать Firephp - дополнение к firebug для отладки php в той же среде, что и javascript.

Я также использую Xdebug, упомянутый ранее для профилирования php.

 80
Author: Pat, 2015-10-07 08:29:03

Это моя маленькая среда отладки:

error_reporting(-1);
assert_options(ASSERT_ACTIVE, 1);
assert_options(ASSERT_WARNING, 0);
assert_options(ASSERT_BAIL, 0);
assert_options(ASSERT_QUIET_EVAL, 0);
assert_options(ASSERT_CALLBACK, 'assert_callcack');
set_error_handler('error_handler');
set_exception_handler('exception_handler');
register_shutdown_function('shutdown_handler');

function assert_callcack($file, $line, $message) {
    throw new Customizable_Exception($message, null, $file, $line);
}

function error_handler($errno, $error, $file, $line, $vars) {
    if ($errno === 0 || ($errno & error_reporting()) === 0) {
        return;
    }

    throw new Customizable_Exception($error, $errno, $file, $line);
}

function exception_handler(Exception $e) {
    // Do what ever!
    echo '<pre>', print_r($e, true), '</pre>';
    exit;
}

function shutdown_handler() {
    try {
        if (null !== $error = error_get_last()) {
            throw new Customizable_Exception($error['message'], $error['type'], $error['file'], $error['line']);
        }
    } catch (Exception $e) {
        exception_handler($e);
    }
}

class Customizable_Exception extends Exception {
    public function __construct($message = null, $code = null, $file = null, $line = null) {
        if ($code === null) {
            parent::__construct($message);
        } else {
            parent::__construct($message, $code);
        }
        if ($file !== null) {
            $this->file = $file;
        }
        if ($line !== null) {
            $this->line = $line;
        }
    }
}
 38
Author: eisberg, 2013-06-05 15:50:36

Xdebug и плагин DBGp для Notepad++ для поиска ошибок в тяжелых условиях, FirePHP для легких вещей. Быстро и грязно? Ничто не сравнится с DBUG.

 32
Author: djn, 2008-09-15 20:23:29

Xdebug необходим для разработки. Я устанавливаю его перед любым другим расширением. Это дает вам трассировку стека при любой ошибке, и вы можете легко включить профилирование.

Для быстрого ознакомления со структурой данных используйте var_dump(). Не используйте print_r(), потому что вам придется окружить его <pre>, и он печатает только один var за раз.

<?php var_dump(__FILE__, __LINE__, $_REQUEST); ?>

Для реальной среды отладки лучшее, что я нашел, - это IDE Komodo, но это стоит $$.

 26
Author: Julio César, 2014-12-15 15:04:21

PhpED действительно хорош. Вы можете входить/выходить/выходить из функций. Вы можете запускать специальный код, проверять переменные, изменять переменные. Это удивительно.

 19
Author: monk.e.boy, 2009-02-05 09:16:41

1) Я использую print_r(). В TextMate у меня есть фрагмент для "pre", который расширяется до следующего:

echo "<pre>";
print_r();
echo "</pre>";

2) Я использую Xdebug, но не смог заставить графический интерфейс работать прямо на моем Mac. Он, по крайней мере, распечатывает читаемую версию трассировки стека.

 17
Author: jlleblanc, 2009-07-29 22:16:39

Я использовал Zend Studio (5.5) вместе с Платформой Zend . Это обеспечивает надлежащую отладку, точки останова/переступание через код и т.д., Хотя и за определенную цену.

 16
Author: Michael Stum, 2008-08-03 23:20:48

Честно говоря, комбинация print и print_r() для распечатки переменных. Я знаю, что многие предпочитают использовать другие, более продвинутые методы, но я нахожу это самым простым в использовании.

Я скажу, что я не полностью оценил это, пока не начал программировать микропроцессоры в университете и не смог использовать даже это.

 16
Author: Teifion, 2008-08-04 21:28:44

Xdebug, автор Дерик Ретанс, очень хорош. Я использовал его некоторое время назад и обнаружил, что его не так просто установить. Как только вы закончите, вы не поймете, как вы обходились без этого:-)

Есть хорошая статья о Зоне разработчиков Zend (установка на Linux не кажется проще) и даже Плагин Firefox, который я никогда не использовал.

 14
Author: Christian Lescuyer, 2008-08-04 21:07:09

Я использую Netbeans с XDebug. Проверьте его на своем веб-сайте для получения документов о том, как его настроить. http://php.netbeans.org/

 11
Author: Nacho, 2008-08-26 15:04:57

Я использую Netbeans с XDebug и надстройкой Easy XDebug для Firefox

Надстройка необходима при отладке проектов MVC, потому что обычный способ запуска XDebug в Netbeans - зарегистрировать сеанс dbug по URL-адресу. С надстройкой, установленной в Firefox, вы должны установить свойства проекта Netbeans - > Запустить конфигурацию -> Дополнительно и выбрать "Не открывать веб-браузер". Теперь вы можете установить точки останова и начать сеанс отладки с помощью Ctrl-F5, как обычно. Откройте FireFox и щелкните правой кнопкой мыши значок надстройки в правом нижнем углу, чтобы начать мониторинг точек останова. Когда код достигнет точки останова, он остановится, и вы сможете проверить свои состояния переменных и стек вызовов.

 11
Author: Jannie Theunissen, 2010-07-09 03:14:15

Буферизация вывода очень полезна, если вы не хотите испортить свой вывод. Я делаю это в одной строке, которую я могу комментировать/раскомментировать по желанию

 ob_start();var_dump(); user_error(ob_get_contents()); ob_get_clean();
 10
Author: Ken, 2008-10-22 09:16:27

PHPEdit имеет встроенный отладчик, но я обычно в конечном итоге использую echo(); и print_r(); старомодный способ!!

 9
Author: Toby Allen, 2008-09-17 10:14:47

Для действительно серьезных проблем, которые потребовали бы слишком много времени, чтобы использовать print_r/echo для выяснения, я использую функцию отладки моей IDE (PhpED). В отличие от других IDE, которые я использовал, PhpED практически не требует настройки. единственная причина, по которой я не использую его для любых проблем, с которыми я сталкиваюсь, заключается в том, что он болезненно медленный. Я не уверен, что медлительность характерна для PhpED или любого отладчика php. PhpED не является бесплатным, но я считаю, что он использует один из отладчиков с открытым исходным кодом (например, XDebug, упомянутый ранее) в любом случае. Преимущество PhpED, опять же, в том, что он не требует настройки, которую я находил действительно довольно утомительной в прошлом.

 8
Author: Karim, 2008-08-22 15:33:44

Ручная отладка, как правило, для меня быстрее - var_dump() и debug_print_backtrace() - это все инструменты, которые вам нужны, чтобы вооружить вашу логику.

 4
Author: Ross, 2008-08-22 15:36:59

Ну, в какой-то степени это зависит от того, где дела идут на юг. Это первое, что я пытаюсь изолировать, а затем при необходимости буду использовать echo/print_r().

NB: Вы, ребята, знаете, что вы можете передать true в качестве второго аргумента print_r(), и он вернет вывод вместо его печати? Например:

echo "<pre>".print_r($var, true)."</pre>";
 3
Author: Nathan Strong, 2008-09-18 03:17:36

Я часто использую CakePHP, когда рельсы невозможны. Для отладки ошибок я обычно нахожу error.log в папке tmp и помещаю его в терминал с помощью команды...

tail -f app/tmp/logs/error.log

Это дает вам возможность запустить диалоговое окно с информацией о том, что происходит, что довольно удобно, если вы хотите вывести что-то в середине кода, который вы можете использовать.

$this->log('xxxx');

Обычно это может дать вам хорошее представление о том, что происходит/не так.

 3
Author: Smickie, 2010-05-10 09:29:24

Print_r(debug_backtrace());

Или что-то в этом роде:-)

 2
Author: Orion Edwards, 2008-08-03 23:32:13

IDE Komodo хорошо работает с xdebug, даже для повторной отладки. Для этого требуется минимальное количество настроек. Все, что вам нужно, - это версия php, которую Komodo может использовать локально для пошагового выполнения кода в точке останова. Если у вас есть скрипт, импортированный в проект komodo, вы можете установить точки останова одним щелчком мыши точно так же, как вы бы установили его в eclipse для отладки программы java. Удаленная отладка, очевидно, сложнее заставить ее работать правильно (возможно, вам придется сопоставить удаленный URL-адрес с php-скриптом в вашем рабочем пространстве), чем локальная настройка отладки, которую довольно легко настроить, если вы находитесь на рабочем столе MAC или Linux.

 2
Author: amit, 2008-08-22 15:44:33

Nusphere также является хорошим отладчиком для php нусфера

 2
Author: Mufaddal, 2012-05-29 12:43:39

Существует множество методов отладки PHP, которые могут сэкономить вам бесчисленное количество часов при написании кода. Эффективным, но базовым методом отладки является простое включение отчетов об ошибках. Другой немного более продвинутый метод включает использование инструкций печати, которые могут помочь выявить более трудноуловимые ошибки, отображая то, что на самом деле происходит на экране. PHPEclipse - это плагин Eclipse, который может выделять распространенные синтаксические ошибки и может использоваться совместно с отладчиком для установки точки останова.

display_errors = Off
error_reporting = E_ALL 
display_errors = On

А также используется

error_log();
console_log();
 2
Author: shekh danishuesn, 2015-10-01 11:16:08

+1 для print_r(). Используйте его для выгрузки содержимого объекта или переменной. Чтобы сделать его более читабельным, сделайте это с помощью предварительного тега, чтобы вам не нужно было просматривать исходный код.

echo '<pre>';
print_r($arrayOrObject);

Также var_dump($вещь) - это очень полезно, чтобы увидеть тип подстановок

 1
Author: Polsonby, 2008-08-05 00:49:42

В производственной среде я записываю соответствующие данные в журнал ошибок сервера с помощью error_log().

 1
Author: Dan Grover, 2008-08-15 04:23:02

Я использую zend studio для eclipse со встроенным отладчиком. Это все еще медленно по сравнению с отладкой с помощью eclipse pdt с помощью xdebug. Надеюсь, они исправят эти проблемы, скорость улучшилась по сравнению с последними выпусками, но все равно перешагивание занимает 2-3 секунды. Панель инструментов zend firefox действительно упрощает работу (отладка следующей страницы, текущей страницы и т. Д.). Также он предоставляет профилировщик, который будет проверять ваш код и предоставлять круговые диаграммы, время выполнения и т.д.

 1
Author: Brendon-Van-Heyzen, 2008-08-17 18:38:01

Большинство ошибок можно легко найти, просто var_dump указав некоторые ключевые переменные, но это, очевидно, зависит от того, какое приложение вы разрабатываете.

Для более сложных алгоритмов функции шага/точки останова/наблюдения очень полезны (если в этом нет необходимости)

 1
Author: Petr Peller, 2010-05-10 09:18:59

PHP DBG (PHP DBG)

Интерактивный пошаговый отладчик PHP, реализованный в виде модуля SAPI, который может предоставить вам полный контроль над средой, не влияя на функциональность или производительность вашего кода. Он стремится быть легкой, мощной, простой в использовании платформой отладки для PHP 5.4+ и поставляется в комплекте с PHP 5.6.

Функции включают в себя:

  • Пошаговая отладка
  • Гибкие точки останова (Метод класса, Функция, Файл: Строка, Адрес, Код операции)
  • Легкий доступ к PHP со встроенным eval()
  • Легкий доступ к текущему исполняемому коду
  • API для пользователей
  • Агностик САПИ - Легко интегрируется
  • Поддержка конфигурационных файлов PHP
  • JIT Супер Глобалы - Устанавливайте Свои Собственные!!
  • Дополнительная поддержка строки считывания - Удобное управление Терминалом
  • Поддержка Удаленной Отладки - Встроенный графический интерфейс Java
  • Простое управление

См. скриншоты:

PHP DBG - Stepthrough Debugging - screenshot

PHP DBG - Stepthrough Debugging - screenshot

Домашняя страница: http://phpdbg.com/

Ошибка PHP - Лучшее сообщение об ошибках для PHP

Это очень простая в использовании библиотека (фактически файл) для отладки ваших PHP-скриптов.

Единственное, что вам нужно сделать, это включить один файл, как показано ниже (в начале вашего кода):

require('php_error.php');
\php_error\reportErrors();

Тогда все ошибки дадут вам такую информацию, как обратная трассировка, контекст кода, аргументы функций, переменные сервера и т.д. Например:

PHP Error | Improve Error Reporting for PHP - screenshot of backtrace PHP Error | Improve Error Reporting for PHP - screenshot of backtrace PHP Error | Improve Error Reporting for PHP - screenshot of backtrace

Функции включают в себя:

  • тривиально использовать, это всего лишь один файл
  • ошибки, отображаемые в браузере для обычных и 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

Вот простое использование:

  1. Выполнить: sudo dtruss-php.d.
  2. При запуске другого терминала: 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).

Вот пример сценария (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

 1
Author: kenorb, 2017-05-23 11:46:25

В зависимости от проблемы мне нравится комбинация error_reporting(E_ALL), смешанная с тестами echo (чтобы найти нарушающую строку/файл, в котором произошла ошибка изначально; вы ЗНАЕТЕ, что php не всегда говорит вам правильно?), сопоставление скобок IDE (для устранения "Ошибки синтаксического анализа: синтаксическая ошибка, непредвиденные проблемы $end") и print_r(); выход; дампы (настоящие программисты просматривают источник; p).

Вы также не можете победить phpdebug (проверьте sourceforge) с помощью "memory_get_usage();" и "memory_get_peak_usage();", чтобы найти проблемные области.

 0
Author: Eric Lamb, 2008-08-06 15:46:25

Встроенные отладчики, в которых вы можете наблюдать за изменением значений переменных по мере прохождения кода, действительно классные. Однако они требуют установки программного обеспечения на сервере и определенной настройки на клиенте. Оба из которых требуют периодического технического обслуживания для поддержания в хорошем рабочем состоянии.

Print_r легко написать и гарантированно работает в любой настройке.

 0
Author: Michael Luton, 2008-08-22 20:10:54

Обычно я нахожу, что создаю пользовательскую функцию журнала, способную сохранять в файле, хранить отладочную информацию и в конечном итоге повторно печатать в общем нижнем колонтитуле.

Вы также можете переопределить общий класс исключений, чтобы этот тип отладки был полуавтоматическим.

 0
Author: Joshi Spawnbrood, 2008-10-22 08:46:43