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

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

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

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

Ответы

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

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

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

Ответ 6

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

Ответ 7

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

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

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

Ответ 8

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

Ответ 9

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

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

Ответ 10

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

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

Ответ 11

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

Ответ 12

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

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

Ответ 13

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

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

Ответ 14

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

Ответ 15

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

Ответ 16

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

Ответ 17

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

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

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

Ответ 18

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

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

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

$this->log('xxxx');

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

Ответ 19

print_r (debug_backtrace());

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

Ответ 20

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

Ответ 21

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

Ответ 22

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

display_errors = Off
error_reporting = E_ALL 
display_errors = On

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

error_log();
console_log();

Ответ 23

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

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

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

Ответ 24

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

Ответ 25

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

Ответ 26

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

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

Ответ 27

PHP DBG

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

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

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

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

PHP DBG - сквозная отладка - скриншот

PHP DBG - сквозная отладка - скриншот

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

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

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

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

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

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

Ошибка PHP | Улучшение отчетов об ошибках для PHP - снимок экрана backtrace Ошибка PHP | Улучшить отчет об ошибках для PHP - снимок экрана backtrace Ошибка PHP | Улучшить отчет об ошибках для PHP - снимок экрана backtrace

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

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

Ответ 28

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

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

Ответ 29

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

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

Ответ 30

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

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