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


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

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

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

30 405

30 ответов:

попробовать Eclipse 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 () для печати переменных. Я знаю, что многие предпочитают использовать другие, более продвинутые методы, но я считаю, это самый простой в использовании.

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

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

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

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

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

надстройка необходима при отладке проектов MVC, поскольку обычный способ запуска XDebug в Netbeans заключается в регистрации сеанса dbug через url-адрес. С надстройкой, установленной в FireFox, вы должны установить свойства проекта Netbeans - > Run Configuratuion- > Advanced и выбрать "не открывать веб-браузер" теперь вы можете установить точки останова и начать сеанс отладки с помощью 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() по мере необходимости.

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

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

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

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

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

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

  1. Run:sudo dtruss-php.d.
  2. на другом терминале запустите:php -r "phpinfo();".

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

php -S localhost:8080

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

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

посмотреть: использование PHP и DTrace at php.net


SystemTap

кроме того, проверьте для трассировки SystemTap дополнительно установить пакет разработки СДТ следствие (например,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

посмотреть: используя коде ядра с поддержкой PHP потребителя статические пробники at php.net

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

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

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

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

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

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