Как вы отлаживаете скрипты PHP?
Я знаю основы отладки, такие как использование отчетов об ошибках. Отладка точки останова в PHPEclipse также весьма полезна.
Что такое Лучший (с точки зрения быстрого и простого) способа отладки в phpStorm или любой другой IDE?
Я считаю, что это отличный вопрос! Когда вы не знаете, как подойти к отладке PHP, вы даже не знаете, как сформулировать свой вопрос, не знаете, как быть более точным, чем это. Таким образом, он может не подчиняться правилам Стэка, но он очень помогает нам, новичкам!
начиная с php5.4 и далее представлен новый отладчик интерфейса командной строки под названием phpdbg (phpdbg.com). PHP5.6 будет поставляться с phpdbg по умолчанию.
Я использую firephp, это действительно здорово, поскольку он отправляет сообщение в журнал консоли (например, console.info ()); посмотрите это видео youtube.com/watch?v=rd5ZwWU-YD4
Вы когда-нибудь слышали о XDebug? :)
Многие, кажется, используют PHPStorm, он легче, чем Eclipse PDT, и проще.






Я использовал Zend Studio (5.5) вместе с Платформа Zend. Это дает правильную отладку, точки останова / обход кода и т. д., Хотя и за свою цену.
Попробуйте Затмение PDT, чтобы настроить среду Eclipse, которая имеет функции отладки, как вы упомянули. Возможность войти в код - намного лучший способ отладки, чем старый метод var_dump, и распечатать в различных точках, чтобы увидеть, где ваш поток идет не так. Когда все остальное терпит неудачу, и все, что у меня есть, это SSH и vim, я все еще var_dump() / die(), чтобы найти, где код идет на юг.
Вам следует использовать эту функцию: kill ($ data) {die (var_dump ($ data)); } Это экономит ввод 10 символов, лучшая функция, которую я когда-либо писал, tbh :)
Попробуйте github.com/tomasfejfar/enhanced-dump :)
Есть ли способ украсить "var_dump"?
@ Tareck117 Да. Вы можете установить xdebug
@Tareck - альтернатива для уточнения вывода отладки: $ v2 = array ("h" => 5, "o" => 10, "p" => 11); $ str = сериализовать ($ v2); эхо "
<pre>" .print_r(unserialize($str), true) . "</pre>";@ Tareck117 Да, используйте вместо него var_export
@ AlexMorley-Finch Я поднимаю вас до kill($data) { echo "<pre>"; var_dump($data); echo "</pre>"; exit; }
Ссылка "восстанавливается" с помощью невероятного Веб-архив, последняя проверка от 7 мая 2015 года.
Не беспокойтесь о веб-архиве, поскольку этот ответ был создан, Eclipse создал правильную среду разработки PHP - eclipse.org/pdt. Я обновил ответ в соответствии с требованиями.
print_r (debug_backtrace ());
или что-то вроде того :-)
Прямо как здесь devarticles.in/php/useful-function-to-output-debug-data-in-p hp
Xdebug, Дерик Ретанс, очень хорошо. Я использовал его некоторое время назад и обнаружил, что его не так просто установить. Когда закончишь, не поймешь, как без него обходились :-)
Есть хорошая статья о Зона разработчика Zend (установка в Linux не кажется проще) и даже о Плагин Firefox, которую я никогда не использовал.
Расстраивает не только установка. Настройка Xdebug для работы с Eclipse может стать кошмаром. Мне удалось установить Xdebug на CentOS 5, но EclipsePDT + Xdebug не хотят сотрудничать :(
Честно говоря, комбинация print и print_r () для распечатки переменных. Я знаю, что многие предпочитают использовать другие, более продвинутые методы, но я считаю, что это самый простой в использовании.
Я скажу, что я не ценил это в полной мере, пока я не занимался программированием микропроцессоров в Uni и не смог использовать даже это.
Я рад, что вы упомянули print, а также print_r, я использую базовую печать, чтобы увидеть, выполняется ли код до определенной точки, что помогает изолировать проблему.
Я использую как print, так и var_dump (). Я использую print для отображения отладочных сообщений и информации и var_dump, чтобы указывать состояние переменных по мере развития событий.
+1 для print_r (). Используйте его для вывода содержимого объекта или переменной. Чтобы сделать его более читабельным, сделайте это с предварительным тегом, чтобы вам не нужно было просматривать исходный код.
echo '<pre>';
print_r($arrayOrObject);
Также var_dump ($ thing) - это очень полезно для просмотра типа под-вещей
Расширенную версию можно найти здесь devarticles.in/php/useful-function-to-output-debug-data-in-p hp
Вот доработанная версия devarticles.in/php/useful-function-to-output-debug-data-in-p hp
Вы можете использовать Firephp как надстройку к firebug для отладки php в той же среде, что и javascript.
Я также использую упомянутый ранее Xdebug для профилирования php.
А вот краткое руководство по использованию FirePHP: sitepoint.com/debug-php-firebug-firephp
В зависимости от проблемы мне нравится комбинация error_reporting (E_ALL), смешанная с эхо-тестами (чтобы найти вызывающую ошибку строку / файл, ошибка произошла изначально; вы ЗНАЕТЕ, что это не всегда строка / файл php говорит вам правильно?), Соответствие скобок IDE (для устранения проблем типа «Ошибка синтаксического анализа: синтаксическая ошибка, непредвиденный $ end») и print_r (); выход; дампы (исходники просматривают настоящие программисты; п).
Вы также не можете победить phpdebug (проверьте sourceforge) с помощью "memory_get_usage ();" и "memory_get_peak_usage ();" найти проблемные места.
1) Я использую print_r (). В TextMate у меня есть фрагмент для pre, который расширяется до следующего:
echo "<pre>";
print_r();
echo "</pre>";
2) Я использую Xdebug, но не могу заставить графический интерфейс правильно работать на моем Mac. По крайней мере, он распечатывает читаемую версию трассировки стека.
Я уверен, что вы имеете в виду эхо ""; в конце концов.
Вы также можете передать в функцию значение true, чтобы она возвращала строку. Это означает, что вы можете это сделать: echo '<pre>', print_r($var, true), '</pre>';
В производственной среде я записываю соответствующие данные в журнал ошибок сервера с помощью error_log ().
и чем tail -f ... отлично работает
Я использую zend studio для затмения со встроенным отладчиком. Это все еще медленно по сравнению с отладкой с помощью eclipse pdt с помощью xdebug. Надеюсь, они исправят эти проблемы, скорость улучшилась по сравнению с последними выпусками, но все равно переход на другую работу занимает 2-3 секунды. Панель инструментов zend firefox действительно упрощает работу (отладка следующей страницы, текущей страницы и т. д.). Также он предоставляет профилировщик, который будет сравнивать ваш код и предоставлять круговые диаграммы, время выполнения и т. д.
Для действительно серьезных проблем, которые потребовали бы слишком много времени, чтобы использовать print_r / echo, чтобы выяснить, я использую функцию отладки моей IDE (PhpEd). В отличие от других IDE, которые я использовал, PhpEd практически не требует настройки. единственная причина, по которой я не использую его для решения каких-либо проблем, с которыми я сталкиваюсь, это то, что он болезненно медленный. Я не уверен, что медлительность характерна для PhpEd или любого отладчика php. PhpEd не является бесплатным, но я считаю, что он в любом случае использует один из отладчиков с открытым исходным кодом (например, XDebug, упомянутый ранее). Преимущество PhpEd, опять же, заключается в том, что он не требует настройки, что я считал довольно утомительным в прошлом.
Отладчик PHPEd на самом деле написан тем же парнем, который написал PHPEd, и я почти уверен, что это не открытый исходный код. По крайней мере, PHPEd не поставляется с исходным кодом, а вместо этого скомпилирован .so и .dll.
Ручная отладка для меня обычно проходит быстрее - var_dump() и debug_print_backtrace() - это все инструменты, которые вам нужны для вооружения вашей логики.
XDebug необходим для разработки. Я устанавливаю его перед любым другим расширением. Он дает вам трассировку стека при любой ошибке, и вы можете легко включить профилирование.
Для быстрого просмотра структуры данных используйте var_dump(). Не используйте print_r(), потому что вам придется окружить его <pre>, и он печатает только одну переменную за раз.
<?php var_dump(__FILE__, __LINE__, $_REQUEST); ?>
Для реальной среды отладки лучшее, что я нашел, - это Komodo IDE, но это стоит $ $$.
Komodo IDE хорошо работает с xdebug даже для удаленной отладки. Требуется минимальное количество настроек. Все, что вам нужно, это версия php, которую Komodo может использовать локально для пошагового выполнения кода в точке останова. Если у вас есть сценарий, импортированный в проект komodo, вы можете установить точки останова одним щелчком мыши точно так же, как вы бы установили их внутри eclipse для отладки java-программы. Удаленная отладка, очевидно, более сложна, чтобы заставить ее работать правильно (возможно, вам придется сопоставить удаленный URL-адрес с php-скриптом в вашем рабочем пространстве), чем локальную настройку отладки, которую довольно легко настроить, если вы используете MAC или рабочий стол Linux. .
Интегрированные отладчики, в которых вы можете наблюдать за изменением значений переменных при пошаговом выполнении кода, действительно хороши. Однако они требуют установки программного обеспечения на сервере и определенной конфигурации на клиенте. Оба из них требуют периодического обслуживания для поддержания в хорошем рабочем состоянии.
Print_r легко написать и гарантированно будет работать в любой настройке.
Я использую Netbeans с XDebug. Посетите его веб-сайт, чтобы узнать, как его настроить. http://php.netbeans.org/
Xdebug и плагин DBGp для Notepad ++ для тяжелого поиска ошибок, FirePHP для легких вещей. Быстро и грязно? Ничто не сравнится с дБуг.
Плагин DBGp не работает с текущей версией notepad ++ / xdebug, и мы не планируем его исправлять. Вы можете увидеть мое обсуждение с создателем по ссылке здесь
PhpEdit имеет встроенный отладчик, но я обычно использую echo (); и print_r (); по старинке !!
Ну, в некоторой степени это зависит от того, где дела идут на юг. Это первое, что я пытаюсь изолировать, а затем при необходимости буду использовать echo / print_r ().
NB: Вы, ребята, знаете, что вы можете передать true в качестве второго аргумента функции print_r (), и она вернет результат вместо того, чтобы печатать его? Например.:
echo "<pre>".print_r($var, true)."</pre>";
Я просто добавляю это в функцию, называемую отладкой. Итак, я могу выполнить отладку ($ var);
Обычно я нахожу создание настраиваемой функции журнала, способной сохранять в файле, хранить отладочную информацию и, в конечном итоге, повторно печатать в общем нижнем колонтитуле.
Вы также можете переопределить общий класс Exception, чтобы этот тип отладки был полуавтоматическим.
Буферизация вывода очень полезна, если вы не хотите испортить вывод. Я делаю это в виде однострочного текста, который могу комментировать / раскомментировать по своему желанию.
ob_start();var_dump(); user_error(ob_get_contents()); ob_get_clean();
Может пригодится devarticles.in/php/useful-function-to-output-debug-data-in-p hp
PhpEd действительно хорош. Вы можете входить / выходить / выходить из функций. Вы можете запускать специальный код, проверять переменные, изменять переменные. Это потрясающе.
Я использовал PhpEd, и у меня нет добрых слов по сравнению с реальной IDE, такой как NetBeans или Eclipse, и этот комментарий не добавляет ничего полезного к вопросу. -1
Я пробовал большинство IDE (включая Zend, NetBeans и Eclipse), прежде чем покупать PhpED Professional, потому что он был лучшим на полторы мили. Это было несколько лет назад, поэтому другие, возможно, с тех пор улучшились, но в то время большинство из них были мучительно медленными, потому что были написаны на Java. Я не понимаю, как у кого-то может быть «без добрых слов к этому», когда (для меня) это было настолько очевидно лучшим, что решение было очевидным.
Это моя маленькая среда отладки:
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;
}
}
}
Спасибо. Это спасло мне день. (Мне просто нужно было удалить этот E_STRICT)
assert_callcack хех
Большинство ошибок можно легко найти, просто задав var_dump некоторые ключевые переменные, но это, очевидно, зависит от того, какое приложение вы разрабатываете.
Для более сложных алгоритмов очень полезны функции step / breakpoint / watch (если нет необходимости).
Я часто использую CakePHP, когда использование Rails невозможно. Для отладки ошибок я обычно нахожу error.log в папке tmp и отслеживаю его в терминале с помощью команды ...
tail -f app/tmp/logs/error.log
Это дает вам запускающий диалог из пирога того, что происходит, что очень удобно, если вы хотите вывести что-то в него в середине кода, который вы можете использовать.
$this->log('xxxx');
Обычно это может дать вам хорошее представление о том, что происходит / не так.
Я использую Netbeans с XDebug и Надстройка Easy XDebug FireFox
Надстройка необходима при отладке проектов MVC, потому что обычный способ работы XDebug в Netbeans - это регистрация сеанса dbug по URL-адресу. Установив надстройку в FireFox, вы должны установить свойства проекта Netbeans -> Запустить конфигурацию -> Дополнительно и выбрать «Не открывать веб-браузер». Теперь вы можете установить точки останова и начать сеанс отладки с помощью Ctrl-F5, как обычно. . Откройте FireFox и щелкните правой кнопкой мыши значок надстройки в правом нижнем углу, чтобы начать мониторинг точек останова. Когда код достигнет точки останова, он остановится, и вы сможете проверить состояния переменных и стек вызовов.
Nusphere также является хорошим отладчиком для php. нусфера
Существует множество методов отладки PHP, которые могут сэкономить вам бесчисленное количество часов при написании кода. Эффективный, но базовый метод отладки - просто включить отчет об ошибках. Другой немного более продвинутый метод включает использование операторов печати, которые могут помочь выявить более неуловимые ошибки, отображая на экране то, что на самом деле происходит. PHPeclipse - это подключаемый модуль Eclipse, который может выделять общие синтаксические ошибки и может использоваться вместе с отладчиком для установки точек останова.
display_errors = Off
error_reporting = E_ALL
display_errors = On
а также использовал
error_log();
console_log();
Интерактивный пошаговый отладчик PHP, реализованный в виде модуля SAPI, может дать вам полный контроль над средой, не влияя на функциональность или производительность вашего кода. Он нацелен на то, чтобы быть легкой, мощной и простой в использовании платформой отладки для PHP 5.4+, и он поставляется прямо из коробки с PHP 5.6.
Возможности включают:
Смотрите скриншоты:
Домашняя страница: http://phpdbg.com/
Это очень простая в использовании библиотека (на самом деле файл) для отладки ваших PHP-скриптов.
Единственное, что вам нужно сделать, это включить один файл, как показано ниже (в начале вашего кода):
require('php_error.php');
\php_error\reportErrors();
Тогда все ошибки предоставят вам такую информацию, как обратная трассировка, контекст кода, аргументы функции, переменные сервера и т. д. Например:
Возможности включают:
Домашняя страница: 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));
}
Home page: dtruss-lamp at GitHub
Вот простое использование:
sudo dtruss-php.d.php -r "phpinfo();".Чтобы проверить это, вы можете перейти к любому корневому документу с index.php и запустить встроенный сервер PHP:
php -S localhost:8080
После этого вы можете зайти на сайт по адресу http: // локальный: 8080 / (или выбрать любой удобный для вас порт). Оттуда перейдите к некоторым страницам, чтобы увидеть результат трассировки.
Примечание: Dtrace доступен в OS X по умолчанию, в Linux вам, вероятно, понадобится dtrace4linux или проверьте наличие другого альтернативы.
См .: Использование PHP и DTrace на php.net
В качестве альтернативы проверьте трассировку 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
См. Также: stackoverflow.com/questions/4640421/…