Как вы отлаживаете PHP- скрипты?
Я знаю об основной отладке, такой как использование отчета об ошибках. Отладка точки останова в PHPEclipse также весьма полезна.
Каков наилучший (с точки зрения быстрого и простого) способ отладки в phpStorm или любой другой среде IDE?
Попробуйте 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 очень полезны (если нет необходимости)
Интерактивный Stepthrough PHP Debugger, реализованный как модуль SAPI, который может дать вам полный контроль над средой, не влияя на функциональность или производительность вашего кода. Он нацелен на легкую, мощную и простую в использовании платформу для отладки для PHP 5.4+, и она поставляется в комплекте с PHP 5.6.
Особенности включают:
Смотрите скриншоты:
Домашняя страница: http://phpdbg.com/
Это очень простая в использовании библиотека (фактически файл) для отладки ваших скриптов PHP.
Единственное, что вам нужно сделать, это включить один файл, как показано ниже (в начале вашего кода):
require('php_error.php'); \php_error\reportErrors();
Затем все ошибки будут давать вам информацию, такую как backtrace, контекст кода, аргументы функции, переменные сервера и т. Д. Например:
Особенности включают:
Домашняя страница: http://phperror.net/
GitHub: https://github.com/JosephLenton/PHP-Error
Моя вилка (с дополнительными исправлениями): https://github.com/kenorb-contrib/PHP-Error
Если ваша система поддерживает динамическую трассировку 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
Вот простое использование:
sudo dtruss-php.d
. 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 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 прост в написании и гарантированно работает в любой настройке.
Обычно я нахожу создание пользовательской функции журнала, способной сохранять в файле, хранить информацию об отладке и, в конечном счете, повторно печатать на общем нижнем колонтитуле.
Вы также можете переопределить общий класс исключений, чтобы этот тип отладки был полуавтоматизирован.