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

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

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

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

30 ответов


попробовать затмение 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, но не смог заставить GUI работать прямо на моем Mac. Он, по крайней мере, печатает читаемую версию трассировки стека.


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


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

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


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

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


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


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

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


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

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

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


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


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


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

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

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

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

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

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

$this->log('xxxx');

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


print_r (debug_backtrace ());

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


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


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


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

display_errors = Off
error_reporting = E_ALL 
display_errors = On

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

error_log();
console_log();

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

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

также вложенностями($штука) - это очень полезно, чтобы увидеть тип subthings


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


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


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

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


PHP DBG

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

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

  • Stepthrough Отладки
  • гибкий Точки Останова (Метод Класса, Функция, Файл:Строка, Адрес, Код Операции)
  • легкий доступ к PHP со встроенным eval ()
  • легкий доступ к текущему исполняемому коду
  • пользовательского интерфейса API
  • SAPI Agnostic-легко интегрируется
  • поддержка файлов конфигурации PHP
  • JIT Super Globals-Установите свой собственный!!
  • опционная поддержка readline-удобная терминальная деятельность
  • Поддержка Удаленной Отладки - В Комплекте Java с графическим интерфейсом
  • Простота В Эксплуатации

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

PHP DBG - Stepthrough Debugging - screenshot

PHP DBG - Stepthrough Debugging - screenshot

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

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

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

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

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

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

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

особенности:

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

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. Run:sudo dtruss-php.d.
  2. при другом запуске терминала:php -r "phpinfo();".

чтобы проверить это, вы можете перейти к любому docroot с index.php и запустите PHP builtin server по:

php -S localhost:8080

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

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

посмотреть: использование PHP и DTrace at 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 статические зонды at php.net


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

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


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

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


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

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