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

405

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

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

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

  • 0
    Смотрите также: stackoverflow.com/questions/4640421/…
Показать ещё 5 комментариев
Теги:
xdebug
phpstorm
debugging

30 ответов

145
Лучший ответ

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

  • 35
    Вы должны использовать эту функцию: kill ($ data) {die (var_dump ($ data)); } Сохранение 10 символов, лучшая функция, которую я когда-либо писал.
  • 2
    Попробуйте github.com/tomasfejfar/enhanced-dump :)
Показать ещё 7 комментариев
84

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

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

39

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

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;
        }
    }
}
  • 2
    Спасибо. Это спасло мой день. (Я просто должен был удалить это E_STRICT)
  • 4
    assert_callcack хе
32

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

  • 0
    Плагин DBGp не работает с текущей версией notepad ++ / xdebug, и нет планов его исправить. Вы можете увидеть мое обсуждение с создателем, связанным здесь
26

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

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

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

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

19

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

  • 4
    Я использовал PhpEd, и у меня нет для него добрых слов по сравнению с реальной IDE, такой как NetBeans или Eclipse, и этот комментарий не добавляет ничего полезного к вопросу. -1
  • 0
    Я попробовал большинство IDE (включая Zend, NetBeans и Eclipse) перед тем, как купить PhpED Professional, потому что он был лучшим на полтора километра. Это было несколько лет назад, поэтому другие, возможно, с тех пор улучшились, но в то время большинство из них были мучительно медленными, потому что были написаны на Java. Я не понимаю, как у кого-то может быть "нет добрых слов для этого", когда (для меня) это было так явно лучше, решение было легким делом.
17

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

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

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

  • 0
    Я уверен, что вы имеете в виду echo "</ pre>"; в конце концов.
  • 0
    Да, я сделал. Спасибо, что поймали это! Сейчас исправлено.
Показать ещё 1 комментарий
16

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

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

  • 0
    Я рад, что вы упомянули print так же как print_r, я использую базовую печать, чтобы увидеть, выполняется ли код до определенной точки, что помогает изолировать проблему.
  • 0
    Я использую как print, так и var_dump (). Я использую print для отображения отладочных сообщений и информации, а var_dump для отображения состояния переменных по мере продвижения.
16

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

14

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

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

  • 2
    Это не просто установка, это расстраивает. Настройка Xdebug для работы с Eclipse может быть кошмаром. Мне удалось установить Xdebug на CentOS 5, но EclipsePDT + Xdebug не хотят сотрудничать :(
11

Я использую Netbeans с XDebug и Easy XDebug FireFox Add-on

Надстройка очень важна, когда вы отлаживаете проекты MVC, потому что обычный путь XDebug работает в Netbeans - зарегистрировать сеанс dbug через URL-адрес. С добавлением, установленным в FireFox, вы должны установить свойства проекта Netbeans → Run Configuratuion → Advanced и выбрать "Не открывать веб-браузер". Теперь вы можете установить свои точки останова и начать сеанс отладки с помощью Ctrl-F5, как обычно, Откройте FireFox и щелкните правой кнопкой мыши значок Add-on в правом нижнем углу, чтобы начать мониторинг для контрольных точек. Когда код достигнет точки останова, он остановится, и вы сможете проверить свои состояния переменных и стек вызовов.

11

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

10

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

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

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

8

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

  • 2
    Отладчик PHPEd на самом деле написан тем же человеком, который написал PHPEd, и я уверен, что он не с открытым исходным кодом. По крайней мере, PHPEd не поставляется с исходным кодом, а вместо этого скомпилировал .so и .dll.
4

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

3

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

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

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

$this->log('xxxx');

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

3

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

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

echo "<pre>".print_r($var, true)."</pre>";
  • 2
    Я просто обертываю это в функцию под названием отладка. Тогда я могу сделать отладку ($ var);
2

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

display_errors = Off
error_reporting = E_ALL 
display_errors = On

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

error_log();
console_log();
2

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

2

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

2

print_r (debug_backtrace());

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

1

PHP DBG

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

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

  • Шаг отладки
  • Гибкие точки останова (метод класса, функция, файл: строка, адрес, код операции)
  • Легкий доступ к PHP со встроенным eval()
  • Легкий доступ к текущему исполнению кода
  • Userland API
  • SAPI Agnostic - легко интегрируется
  • Поддержка файла конфигурации PHP.
  • JIT Super Globals - установите свой собственный!
  • Дополнительная поддержка readline - Удобная работа терминала
  • Поддержка удаленной отладки - объединенный графический интерфейс Java
  • Простая эксплуатация

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

Изображение 753

Изображение 754

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

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

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

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

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

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

Изображение 755 Изображение 756 Изображение 757

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

  • тривиально использовать, это всего лишь один файл
  • ошибки, отображаемые в браузере для обычных и ajaxy-запросов
  • Запросы AJAX приостанавливаются, что позволяет автоматически повторно запускать их
  • делает ошибки настолько строгими, насколько это возможно (поощряет качество кода и, как правило, повышает производительность)
  • фрагменты кода по всей трассировке стека
  • предоставляет дополнительную информацию (например, полные функциональные подписи)
  • исправляет некоторые сообщения об ошибках, которые просто неверны.
  • подсветка синтаксиса
  • выглядит красиво!
  • настройка
  • вручную включить и выключить
  • запускать определенные разделы без сообщений об ошибках
  • игнорировать файлы, позволяющие избежать выделения кода в трассировке стека
  • файлы приложений; они приоритетны при ошибке!

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

GitHub: https://github.com/JosephLenton/PHP-Error

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

DTrace

Если ваша система поддерживает DTrace динамическую трассировку (устанавливается по умолчанию в OS X) и ваш PHP скомпилирован с включенными зондами DTrace (--enable-dtrace), который должен быть по умолчанию, эта команда может помочь вам отлаживать PHP script без времени:

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); }"'

вы можете проследить свой script с легко запоминающимся псевдонимом: trace-php.

Вот более продвинутый dtrace script, просто сохраните его в 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

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

  • Выполнить: 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, установив пакет разработки 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

1

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

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

1

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

1

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

  • 0
    и чем хвостик -f ... прекрасно работает
1

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

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

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

0

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

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

0

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

A print_r прост в записи и гарантированно работает в любой настройке.

0

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

Вы также не можете бить phpdebug (check sourceforge) с помощью функции памяти_get_usage(); и "memory_get_peak_usage();" для поиска проблемных областей.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню