Как я могу получить полезные сообщения об ошибках в PHP? - PullRequest
538 голосов
/ 10 мая 2009

Я нахожу программирование на PHP довольно разочаровывающим. Довольно часто я пытаюсь запустить скрипт и просто получить пустой экран обратно. Нет сообщения об ошибке, просто пустой экран. Причиной может быть простая синтаксическая ошибка (неправильная скобка, пропущенная точка с запятой), сбой вызова функции или что-то еще полностью.

Очень трудно понять, что пошло не так. Я заканчиваю тем, что комментирую код, везде вводю «эхо» и т. Д., Пытаясь сузить проблему. Но наверняка должен быть лучший путь, верно?

Итак, есть ли способ заставить PHP генерировать полезное сообщение об ошибке, как это делает Java? Кто-нибудь может порекомендовать хорошие советы и приемы отладки PHP?

Ответы [ 26 ]

472 голосов
/ 10 мая 2009

Для синтаксических ошибок необходимо включить отображение ошибок в php.ini. По умолчанию они отключены, потому что вы не хотите, чтобы «клиент» видел сообщения об ошибках. Проверьте эту страницу в документации PHP для получения информации о 2 директивах: error_reporting и display_errors. display_errors вероятно тот, который вы хотите изменить. Если вы не можете изменить php.ini, вы также можете добавить следующие строки в файл .htaccess:

php_flag  display_errors        on
php_value error_reporting       2039

Возможно, вы захотите использовать значение E_ALL (как упомянуто Gumbo) для вашей версии PHP для error_reporting, чтобы получить все ошибки. подробнее

3 других элемента: (1) Вы можете проверить файл журнала ошибок, так как в нем будут все ошибки (если не было отключено ведение журнала). (2) Добавление следующих 2 строк поможет вам отлаживать ошибки, которые не являются синтаксическими ошибками:

error_reporting(-1);
ini_set('display_errors', 'On');

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

Ссылка Картмана также очень хороша: http://www.ibm.com/developerworks/library/os-debug/

434 голосов
/ 04 июля 2011

Следующее включает все ошибки:

ini_set('display_startup_errors', 1);
ini_set('display_errors', 1);
error_reporting(-1);

Также смотрите следующие ссылки

54 голосов
/ 10 мая 2009

Вы можете включить следующие строки в файл, который хотите отладить:

error_reporting(E_ALL);
ini_set('display_errors', '1');

Это переопределяет настройки по умолчанию в php.ini, которые просто заставляют PHP сообщать об ошибках в журнал.

51 голосов
/ 03 февраля 2014

Конфигурация PHP

2 записи в php.ini диктуют вывод ошибок:

  1. display_errors
  2. error_reporting

В production , display_errors обычно устанавливается на Off (что хорошо, потому что отображение ошибок на производственных площадках обычно нежелательно!).

Однако в development его следует установить на On, чтобы отображались ошибки. Проверьте !

error_reporting (по состоянию на PHP 5.3) по умолчанию установлено на E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED (имеется в виду, что все отображается за исключением уведомлений, строгих стандартов и уведомлений об устаревании). В случае сомнений установите значение E_ALL, чтобы отобразить все ошибок. Проверьте !

Воу, воу! Нет проверки! Я не могу изменить свой php.ini!

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

Конфигурация времени выполнения

В желаемом скрипте мы можем изменять записи php.ini во время выполнения! Это значит, что он запустится, когда скрипт запустится! Классно!

<strong><a href="http://il1.php.net/manual/en/function.error-reporting.php" rel="nofollow noreferrer">error_reporting</a></strong>(E_ALL);
<strong><a href="http://php.net/ini_set" rel="nofollow noreferrer">ini_set</a></strong>("display_errors", "On");

Эти две строки будут иметь тот же эффект, что и изменение записей php.ini, как указано выше! Удивительный!

Я все еще получаю пустую страницу / ошибка 500!

Это означает, что скрипт даже не запускался! Это обычно происходит, когда у вас есть синтаксическая ошибка!

При синтаксических ошибках скрипт даже не попадает во время выполнения. Сбой в время компиляции , что означает, что он будет использовать значения в php.ini, которые, если вы не изменились, могут не разрешить отображение ошибок.

Журналы ошибок

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

Если у вас есть доступ к php.ini, вы можете найти его под error_log.

29 голосов
/ 10 мая 2009

Существует действительно полезное расширение под названием " xdebug ", которое также сделает ваши отчеты намного приятнее.

24 голосов
/ 24 января 2013

Для быстрого, практического устранения неисправностей я обычно предлагаю здесь на SO:

error_reporting(~0); ini_set('display_errors', 1);

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

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

Следующие вопросы для рассмотрения:

  • Установите Xdebug и включите удаленную отладку с помощью вашей IDE.

Смотрите также:

16 голосов
/ 04 июля 2011

Если вы очень крутой, вы можете попробовать:

$test_server = $_SERVER['SERVER_NAME'] == "127.0.0.1" || $_SERVER['SERVER_NAME'] == "localhost" || substr($_SERVER['SERVER_NAME'],0,3) == "192";

ini_set('display_errors',$test_server);
error_reporting(E_ALL|E_STRICT);

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

Любые ошибки, которые происходят до запуска скрипта, не будут обнаружены, но для 99% ошибок, которые я делаю, это не проблема.

15 голосов
/ 06 мая 2013

В верхней части страницы выберите параметр

error_reporting(E_ERROR | E_WARNING | E_PARSE);
15 голосов
/ 04 июля 2011

Чтобы сохранить это и сделать его более удобным, вы можете отредактировать файл php.ini. Обычно он хранится в /etc/php.ini или /etc/php/php.ini, но более локальные php.ini могут перезаписывать его, в зависимости от рекомендаций по настройке хостинг-провайдера. Проверьте файл phpinfo() на Loaded Configuration File вверху, чтобы убедиться, какой файл загружается последним.

Поиск отображаемых ошибок в этом файле. Должно быть только 3 экземпляра, из которых 2 прокомментированы.

Измените незакомментированную строку на:

display_errors = stdout
13 голосов
/ 16 июля 2015

Я рекомендую Nette Tracy для лучшей визуализации ошибок и исключений в PHP:

Nette Tracy screenshot

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