Intereting Posts
отправьте форму с помощью флажка Настроить страницу 500 ошибок в php Использование регулярного выражения для фильтрации года фиксированной длины 0 или 4 цифры PHP MySQLi Singleton для Ajax-запросов заканчивается многими процессами как настроить Laravel mail.php для использования функции почты usuall? функция ошибки выполняет () в булевом режиме, предотвращая дублирование извлекать данные из базы данных mysql на основе типов отпуска, таких как Exam, Unpaid, Annual Как перенаправить сайт.com/forum/index.php на сайт.com/forum/ php 5.3 избегать дублирования try / catch, вложенного в цикл foreach (сэндвич кода) изменение класса, сгенерированного в PHP, в нескольких браузерах с использованием CSS невозможно установить разрешения для загрузки изображений с помощью библиотеки php gd как проверить, пусто ли поле файла? Как объединить два массива без двойных значений в php? == и === операторы в php 14 марта не 86400 секунд?

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

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

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

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

Solutions Collecting From Web of "Как вы отлаживаете PHP-скрипты?"

Попробуйте 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 действительно хорош. Вы можете входить в / над / из функций. Вы можете запускать ad-hoc-код, проверять переменные, изменять переменные. Это потрясающе.

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

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

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

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

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

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

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

Существует хорошая статья о 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 и щелкните правой кнопкой мыши значок Add-on в правом нижнем углу, чтобы начать мониторинг для контрольных точек. Когда код достигнет точки останова, он остановится, и вы сможете проверить свои состояния переменных и стек вызовов.

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

  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, когда Rails невозможно. Чтобы отлаживать ошибки, я обычно обнаруживаю error.log в папке tmp и хвост его в терминале с помощью команды …

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

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

 $this->log('xxxx'); 

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

print_r (debug_backtrace ());

или что-то типа того 🙂

IDE Komodo хорошо работает с 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_dump некоторыми ключевыми переменными, но, очевидно, это зависит от того, какое приложение вы разрабатываете.

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

PHP DBG

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

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

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

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

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

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

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

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

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

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

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

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

Ошибка 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-lamp в GitHub

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

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

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

Вот пример скрипта ( all_probes.stp ) для отслеживания всех основных статических 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

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

Вы также не можете бить phpdebug (проверить sourceforge) с помощью функции памяти_get_usage (); и "memory_get_peak_usage ();" для поиска проблемных областей.

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

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

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

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