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

php eclipse debugging phpstorm xdebug

340264 просмотра

30 ответа

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

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

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

Автор: Marcel Источник Размещён: 24.07.2019 12:35

Ответы (30)


145 плюса

Решение

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

Автор: John Downey Размещён: 03.08.2008 11:28

80 плюса

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

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

Автор: Pat Размещён: 05.08.2008 05: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;
        }
    }
}
Автор: eisberg Размещён: 29.06.2009 01:40

32 плюса

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

Автор: djn Размещён: 15.09.2008 08:23

26 плюса

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

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

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

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

Автор: Julio César Размещён: 22.08.2008 03:43

19 плюса

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

Автор: monk.e.boy Размещён: 05.02.2009 09:16

17 плюса

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

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

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

Автор: jlleblanc Размещён: 07.08.2008 12:25

16 плюса

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

Автор: Michael Stum Размещён: 03.08.2008 11:20

16 плюса

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

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

Автор: Teifion Размещён: 04.08.2008 09:28

14 плюса

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

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

Автор: Christian Lescuyer Размещён: 04.08.2008 09:07

11 плюса

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

Автор: Nacho Размещён: 26.08.2008 03:04

11 плюса

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

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

Автор: Jannie Theunissen Размещён: 09.07.2010 03:14

10 плюса

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

 ob_start();var_dump(); user_error(ob_get_contents()); ob_get_clean();
Автор: Ken Размещён: 22.10.2008 09:16

9 плюса

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

Автор: Toby Allen Размещён: 17.09.2008 10:14

8 плюса

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

Автор: Karim Размещён: 22.08.2008 03:33

4 плюса

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

Автор: Ross Размещён: 22.08.2008 03:36

3 плюса

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

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

echo "<pre>".print_r($var, true)."</pre>";
Автор: Nathan Strong Размещён: 18.09.2008 03:17

3 плюса

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

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

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

$this->log('xxxx');

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

Автор: MintDeparture Размещён: 10.05.2010 09:29

2 плюса

print_r (debug_backtrace ());

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

Автор: Orion Edwards Размещён: 03.08.2008 11:32

2 плюса

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

Автор: amit Размещён: 22.08.2008 03:44

2 плюса

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

Автор: Mufaddal Размещён: 29.05.2012 12:43

2 плюса

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

display_errors = Off
error_reporting = E_ALL 
display_errors = On

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

error_log();
console_log();
Автор: shekh danishuesn Размещён: 01.10.2015 11:16

1 плюс

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

Автор: Dan Grover Размещён: 15.08.2008 04:23

1 плюс

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

Автор: Brendon-Van-Heyzen Размещён: 17.08.2008 06:38

1 плюс

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

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

Автор: Petr Peller Размещён: 10.05.2010 09:18

1 плюс

PHP DBG

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

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

  • Пошаговая отладка
  • Гибкие точки останова (метод класса, функция, файл: строка, адрес, код операции)
  • Простой доступ к PHP со встроенным eval ()
  • Легкий доступ к исполняемому коду
  • Userland 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-запросы приостановлены, что позволяет автоматически перезапускать их
  • делает ошибки максимально строгими (повышает качество кода и повышает производительность)
  • фрагменты кода по всей трассировке стека
  • предоставляет больше информации (например, полнофункциональные подписи)
  • исправляет некоторые сообщения об ошибках, которые просто неправильно
  • подсветка синтаксиса
  • выглядит довольно!
  • настройка
  • manually turn it on and off
  • run specific sections without error reporting
  • ignore files allowing you to avoid highlighting code in your stack trace
  • application files; these are prioritized when an error strikes!

Home page: http://phperror.net/

GitHub: https://github.com/JosephLenton/PHP-Error

My fork (with extra fixes): https://github.com/kenorb-contrib/PHP-Error

DTrace

If your system supports DTrace dynamic tracing (installed by default on OS X) and your PHP is compiled with the DTrace probes enabled (--enable-dtrace) which should be by default, this command can help you to debug PHP script with no time:

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

So given the following alias has been added into your rc files (e.g. ~/.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

Автор: kenorb Размещён: 21.03.2016 12:34

0 плюса

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

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

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

Автор: Polsonby Размещён: 05.08.2008 12:49

0 плюса

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

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

Автор: Eric Lamb Размещён: 06.08.2008 03:46

0 плюса

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

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

Автор: Michael Luton Размещён: 22.08.2008 08:10

0 плюса

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

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

Автор: Joshi Spawnbrood Размещён: 22.10.2008 08:46
Вопросы из категории :
32x32