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


403

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

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

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


Смотрите также: stackoverflow.com/questions/4640421/…
kenorb


40
Я считаю, что это отличный вопрос! Когда вы не знаете, как подходить к отладке PHP, вы даже не знаете, как сформулировать свой вопрос, не знаете, как быть более точным, чем это. Таким образом, он может не подчиняться правилам стека, но он, безусловно, очень помогает нам, новичкам!
Михаела

1
Начиная с php5.4, появился новый отладчик интерфейса командной строки phpdbg ( phpdbg.com ). PHP5.6 будет поставляться с phpdbg по умолчанию.
Ганеш Патил

1
Вы когда-нибудь слышали о XDebug? :)
Пратик

Ответы:


145

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


35
Вы должны использовать эту функцию: kill ($ data) {die (var_dump ($ data)); } Это экономит набор 10 символов, лучшая функция, которую я когда-либо писал tbh :)
AlexMorley-Finch


2
Есть ли способ украсить "var_dump"?
RPDeshaies

6
@ AlexMorley-Finch Я подниму тебя доkill($data) { echo "<pre>"; var_dump($data); echo "</pre>"; exit; }
Франциско Presencia

2
Ссылка «восстанавливается» через невероятный веб-архив , последняя проверка от 7 мая 15 года.
Грубер

80

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

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


3
И вот краткое руководство по использованию FirePHP: sitepoint.com/debug-php-firebug-firephp
Михаела

38

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

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

4
assert_callcackхех
Madbreaks

32

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


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

26

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

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

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

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


19

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


4
Я использовал PhpEd, и у меня нет для него добрых слов по сравнению с реальной IDE, такой как NetBeans или Eclipse, и этот комментарий не добавляет ничего полезного к вопросу. -1
Силиконрокстар

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

17

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

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

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


Я уверен, что вы имеете в виду echo "</ pre>"; в конце концов.
altermativ

9
Вы также можете передать 'true' в функцию, чтобы она возвращала строку. Это означает, что вы можете сделать это:echo '<pre>', print_r($var, true), '</pre>';
DisgruntledGoat


16

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

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


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

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

14

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

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


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


11

Я использую Netbeans с XDebug и надстройкой Easy XDebug FireFox

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


10

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

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



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

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

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

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

2
Я просто обертываю это в функцию под названием отладка. Тогда я могу сделать отладку ($ var);
jdelator

3

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

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

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

$this->log('xxxx');

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



2

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



2

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

display_errors = Off
error_reporting = E_ALL 
display_errors = On

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

error_log();
console_log();

1

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


и чем tail -f ... прекрасно работает
markus_p

1

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


1

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

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


1

PHP DBG

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

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

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

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

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

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

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

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

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

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

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

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

Ошибка 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:

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();".

Чтобы проверить это, вы можете перейти к любому документу 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


0

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

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

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


Расширенная версия может быть найдена здесь devarticles.in/php/useful-function-to-output-debug-data-in-php
Арвинд К.


0

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

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


0

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

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


0

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.