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

голоса
405

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

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

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

Задан 04/08/2008 в 00:18
источник пользователем
На других языках...                            


30 ответов

голоса
145

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

Ответил 04/08/2008 d 00:28
источник пользователем

голоса
80

Вы можете использовать FirePHP Надстройка на поджигатель для отладки PHP в той же среде, как JavaScript.

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

Ответил 05/08/2008 d 18:22
источник пользователем

голоса
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;
        }
    }
}
Ответил 29/06/2009 d 14:40
источник пользователем

голоса
32

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

Ответил 15/09/2008 d 21:23
источник пользователем

голоса
26

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

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

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

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

Ответил 22/08/2008 d 16:43
источник пользователем

голоса
19

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

Ответил 05/02/2009 d 10:16
источник пользователем

голоса
17

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

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

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

Ответил 07/08/2008 d 01:25
источник пользователем

голоса
16

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

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

Ответил 04/08/2008 d 22:28
источник пользователем

голоса
16

Я использовал Zend Studio (5,5) , вместе с Zend Platform . Это дает надлежащую отладку, точки останова / перешагивая кода и т.д., хотя по цене.

Ответил 04/08/2008 d 00:20
источник пользователем

голоса
14

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

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

Ответил 04/08/2008 d 22:07
источник пользователем

голоса
11

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

Надстройка имеет важное значение при отладке проектов MVC, так как нормальный способ XDebug работает в Netbeans, чтобы зарегистрировать DBUG сессии через URL. С надстройкой установлена ​​в FireFox, вы должны установить свои свойства проекта Netbeans -> Run Configuratuion -> Дополнительно и выберите «Do Not Open Web Browser» Теперь вы можете установить точки останова и начать сеанс отладки с помощью Ctrl-F5, как обычно, , Открыть FireFox и щелкните правой кнопкой мыши на надстройку на значок в правом нижнем углу, чтобы начать мониторинг контрольных точек. Когда код достигает точки останова он остановится, и вы можете проверить свои переменные состояния и называют стеком.

Ответил 09/07/2010 d 04:14
источник пользователем

голоса
11

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

Ответил 26/08/2008 d 16:04
источник пользователем

голоса
10

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

 ob_start();var_dump(); user_error(ob_get_contents()); ob_get_clean();
Ответил 22/10/2008 d 10:16
источник пользователем

голоса
9

PHPEdit имеет встроенный отладчик, но я обычно в конечном итоге с помощью эха (); и print_r (); старомодный способ !!

Ответил 17/09/2008 d 11:14
источник пользователем

голоса
8

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

Ответил 22/08/2008 d 16:33
источник пользователем

голоса
4

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

Ответил 22/08/2008 d 16:36
источник пользователем

голоса
3

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

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

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

$this->log('xxxx');

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

Ответил 10/05/2010 d 10:29
источник пользователем

голоса
3

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

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

echo "<pre>".print_r($var, true)."</pre>";
Ответил 18/09/2008 d 04:17
источник пользователем

голоса
2

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

display_errors = Off
error_reporting = E_ALL 
display_errors = On

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

error_log();
console_log();
Ответил 01/10/2015 d 11:16
источник пользователем

голоса
2

NuSphere также хороший отладчик для PHP NuSphere

Ответил 29/05/2012 d 13:43
источник пользователем

голоса
2

Komodo IDE работает хорошо с Xdebug, даже для отладки Remore. Необходимо минимальное количество конфигурации. Все, что вам нужно, это версия PHP, что Komodo можно использовать локально пошагово код на точке останова. Если сценарий импортирован в Комодо проекта, то вы можете установить точки останова с щелчком мыши просто, как вы бы установить его внутри затмения для отладки программы Java. Удаленная отладка явно сложнее, чтобы заставить его работать правильно (вы, возможно, придется карту удаленного сервера с PHP скрипт в вашем рабочем пространстве), чем локальной настройки отладки, которая очень проста в настройке, если вы находитесь на MAC или Linux для настольных компьютеров ,

Ответил 22/08/2008 d 16:44
источник пользователем

голоса
2

print_r (debug_backtrace ());

или что-то типа того :-)

Ответил 04/08/2008 d 00:32
источник пользователем

голоса
1

PHP DBG

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

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

  • Stepthrough Debugging
  • Гибкие Breakpoints (метод класса, функция, файл: линия, адрес, Опкод)
  • Легкий доступ к PHP со встроенной Eval ()
  • Легкий доступ к В настоящее время выполнения кода
  • Самодельная API
  • SAPI Агностик - Легко Интегрированный
  • Поддержка файлов PHP конфигурации
  • JIT Супер Глобалы - установить свой собственный !!
  • Дополнительный Readline Поддержка - Удобный терминал работы
  • Удаленная отладка Поддержка - Связанная GUI Java
  • Простое управление

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

PHP DBG - Stepthrough Debugging - скриншот

PHP DBG - Stepthrough Debugging - скриншот

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

PHP Error - Лучше отчетов об ошибках для PHP

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

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

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

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

PHP Error |  Улучшение отчетов об ошибках для PHP - скриншот трассировки PHP Error |  Улучшение отчетов об ошибках для PHP - скриншот трассировки PHP Error |  Улучшение отчетов об ошибках для PHP - скриншот трассировки

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

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

Таким образом , учитывая следующий псевдоним был добавлен в ваши радиоуправляемые файлы (например ~/.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 с помощью:

php -S localhost:8080

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

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

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

Ответил 21/03/2016 d 12:34
источник пользователем

голоса
1

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

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

Ответил 10/05/2010 d 10:18
источник пользователем

голоса
1

Я использую Zend Studio для затмения с помощью встроенного отладчика. Его по-прежнему медленно по сравнению с отладкой с Eclipse PDT с Xdebug. Надеемся, что они будут исправить эти проблемы, скорость улучшилась за последние релизы, но все еще перешагивая вещей занимает 2-3 секунды. Зенд светлячок панель действительно делает вещи легко (отладка на следующей странице, текущая страница, и т.д.). Кроме того, он обеспечивает профайлер, который будет эталоном кода и обеспечивают круговые диаграммы, время выполнения и т.д.

Ответил 17/08/2008 d 19:38
источник пользователем

голоса
1

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

Ответил 15/08/2008 d 05:23
источник пользователем

голоса
1

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

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

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

Ответил 05/08/2008 d 01:49
источник пользователем

голоса
0

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

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

Ответил 22/10/2008 d 09:46
источник пользователем

голоса
0

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

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

Ответил 22/08/2008 d 21:10
источник пользователем

голоса
0

В зависимости от вопроса мне нравится сочетание error_reporting (E_ALL), смешанный с тестами эха (найти ошибочную строку / файл ошибка произошла в Initally, вы знаете, что это не всегда линия / файл PHP говорит вам, верно?), Согласование IDE скобки (для устранения «синтаксическая ошибка: синтаксическая ошибка, неожиданный конец $» Вопросы) и print_r (); Выход; отвалы (настоящие программисты просмотра источника; р).

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

Ответил 06/08/2008 d 16:46
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more