Вопрос

Как вы выполняете отладку PHP сценарии?

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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;
        }
    }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Я использую Netbeans с XDebug и Простое дополнение XDebug для FireFox

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

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

 ob_start();var_dump(); user_error(ob_get_contents()); ob_get_clean();

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

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

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

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

Примечание:Ребята, вы знаете, что вы можете передать true в качестве второго аргумента функции print_r(), и она вернет результат вместо того, чтобы печатать его?Например.:

echo "<pre>".print_r($var, true)."</pre>";

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

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

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

$this->log('xxxx');

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

print_r( debug_backtrace() );

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

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

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

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

display_errors = Off
error_reporting = E_ALL 
display_errors = On

а также использованный

error_log();
console_log();

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

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

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

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

PHP DBG

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

Особенности включают в себя:

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

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

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/

ГитХаб: https://github.com/JosephLenton/PHP-Error

Моя вилка (с дополнительными исправлениями): https://github.com/kenorb-contrib/PHP-Error

DTrace ( трассировка )

Если ваша система поддерживает Динамическая трассировка 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();".

Чтобы проверить это, вы можете зайти в любой docroot с помощью index.php и запустите встроенный в PHP сервер с помощью:

php -S localhost:8080

После этого вы можете получить доступ к сайту по адресу http://localhost:8080/ (или выберите любой удобный для вас порт).Оттуда получите доступ к некоторым страницам, чтобы увидеть результаты трассировки.

Примечание:Dtrace доступен в OS X по умолчанию, в Linux вам, вероятно, понадобится dtrace4linux или проверьте наличие какого-нибудь другого альтернативы.

Видишь: Использование PHP и DTrace в php.net


SystemTap ( Системный подход )

В качестве альтернативы проверьте наличие трассировки 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 для print_r().Используйте его для выгрузки содержимого объекта или переменной.Чтобы сделать его более читабельным, сделайте это с тегом pre, чтобы вам не нужно было просматривать исходный код.

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

Также var_dump($thing) - это очень полезно для просмотра типа подзаголовков

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

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

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

Параметр print_r прост в написании и гарантированно будет работать в любой настройке.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top