Как получить полезные сообщения об ошибках в PHP?

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

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

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

Solutions Collecting From Web of "Как получить полезные сообщения об ошибках в PHP?"

Для синтаксических ошибок вам нужно включить отображение ошибок в php.ini. По умолчанию они отключены, потому что вы не хотите, чтобы «клиент» видел сообщения об ошибках. Проверьте эту страницу в документации PHP для получения информации о двух директивах: 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) Добавление следующих двух строк поможет вам отлаживать ошибки, которые не являются синтаксическими ошибками:

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

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

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

Ниже перечислены все ошибки:

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

Также см. Следующие ссылки

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

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

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

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

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

  1. display_errors
  2. error_reporting

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

Однако в разработке он должен быть установлен в положение « On , Чтобы отображались ошибки. Проверьте !

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

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

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

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

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

 error_reporting (E_ALL); ini_set ("display_errors", "On"); 

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

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

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

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

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

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

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

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

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

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

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

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

Следующее:

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

См. Также:

  • Сообщение об ошибках (PHP правильно).
  • Предопределенные константы Документы
  • error_reporting() Документы
  • Документы display_errors

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

 $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% ошибок, которые я делаю, это не проблема.

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

 error_reporting(E_ERROR | E_WARNING | E_PARSE); 
 error_reporting(E_ALL | E_STRICT); ini_set('display_errors', 1); ini_set('html_errors', 1); 

Кроме того, вы можете получить более подробную информацию с помощью xdebug .

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

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

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

 display_errors = stdout 
 error_reporting(E_ALL | E_STRICT); 

И включите ошибки отображения в php.ini

Вы можете зарегистрировать свой собственный обработчик ошибок в PHP. Например, сброс всех ошибок в файл может помочь вам в этих неясных случаях. Обратите внимание, что ваша функция будет вызвана, независимо от того, для чего установлен текущий параметр error_reporting . Очень простой пример:

 function dump_error_to_file($errno, $errstr) { file_put_contents('/tmp/php-errors', date('Ymd H:i:s - ') . $errstr, FILE_APPEND); } set_error_handler('dump_error_to_file'); 

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

Скриншот Nette Tracy

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

FirePHP также может быть полезен.

Две ключевые строки, необходимые для получения полезных ошибок из PHP:

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

Как указывали другие участники, они по умолчанию отключены по соображениям безопасности. Как полезный совет – когда вы настраиваете свой сайт, удобно использовать переключатель для разных сред, чтобы эти ошибки были включены по умолчанию в вашей локальной среде и средах разработки. Это может быть достигнуто с помощью следующего кода (в идеале в вашем файле index.php или config, так что он активен с самого начала):

 switch($_SERVER['SERVER_NAME']) { // local case 'yourdomain.dev': // dev case 'dev.yourdomain.com': ini_set('display_errors',1); error_reporting(E_ALL); break; //live case 'yourdomain.com': //... break; } 

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

если вы пользователь ubuntu, то перейдите к своему терминалу и запустите эту команду

 sudo tail -50f /var/log/apache2/error.log 

где будет отображаться последние 50 ошибок. Существует файл ошибки error.log для apache2, который регистрирует все ошибки.

Вы можете включить полную отчетность об ошибках (включая уведомления и строгие сообщения). Некоторые люди считают это слишком многословным, но это стоит попробовать. Установите error_reporting в E_ALL | E_STRICT E_ALL | E_STRICT в вашем php.ini.

 error_reporting = E_ALL | E_STRICT 

E_STRICT уведомит вас об устаревших функциях и даст вам рекомендации о лучших методах выполнения определенных задач.

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

 error_reporting = (E_ALL | E_STRICT) & ~E_NOTICE 

Также убедитесь, что display_errors включен в php.ini. Если ваша версия PHP старше 5.2.4, установите для нее значение:

 display_errors = "On" 

Если ваша версия 5.2.4 или новее, используйте:

 display_errors = "stderr" 

Чтобы включить полную отчетность об ошибках, добавьте это в свой скрипт:

 error_reporting(E_ALL); 

Это приводит к появлению даже минимальных предупреждений. И, на всякий случай:

 ini_set('display_errors', '1'); 

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

Помимо ошибок error_reporting и display_errors ini, вы можете получить ошибки SYNTAX из файлов журнала вашего веб-сервера. Когда я занимаюсь разработкой PHP, я загружаю журналы своего веб-сервера системы разработки в свой редактор. Всякий раз, когда я проверяю страницу и получаю пустой экран, файл журнала устаревает, и мой редактор спрашивает, хочу ли я перезагрузить его. Когда я это делаю, я прыгаю на дно и появляется синтаксическая ошибка. Например:

 [Sun Apr 19 19:09:11 2009] [error] [client 127.0.0.1] PHP Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in D:\\webroot\\test\\test.php on line 9 

«ОШИБКИ» – это самое полезное для разработчиков, чтобы знать свои ошибки и разрешать их, чтобы система работала идеально.

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

Лучшие способы написать следующие две строки в верхней части скрипта, чтобы получить все сообщения об ошибках:

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

Другой способ использовать инструменты отладчика, такие как xdebug в вашей среде IDE.

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

Таким образом, я всегда создаю файл / программу (которую я обычно называю «genwrap.php»), которая имеет по существу тот же самый код, что и популярное решение здесь (т. Е. Включить отчет об ошибках), а также включает страницу, на которой я действительно хочу вызов.

Для реализации этой отладки есть 2 шага;

Один – создайте genwrap.php и вставьте в него этот код:

 <?php error_reporting(-1); ini_set('display_errors', 'On'); include($_REQUEST['page']); ?> 

Два – измените ссылку на программу / страницу, которую вы хотите отлаживать, чтобы перейти через genwrap.php,

Например: изменение:

 $.ajax('dir/pgm.php?param=val').done(function(data) { /* ... */ 

в

 $.ajax('dir/genwrap.php?page=pgm.php&param=val').done(function(data) { /* ... */ 

http://todell.com/debug также может быть полезен. Вы можете увидеть ваши значения объектов или сбросить ошибки отладки позади сцены даже в режиме производства.

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

Неустранимые ошибки:

 register_shutdown_function 

http://php.net/manual/en/function.register-shutdown-function.php

Ошибки:

 set_error_handler 

http://php.net/manual/en/function.set-error-handler.php

обратная трассировка:

 debug_backtrace 

http://php.net/manual/en/function.debug-backtrace.php

Используйте Кинт. Это комбинация команд отладки на стероидах. https://raveren.github.io/kint/ Он очень похож на Nette Tracy

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

Моя обычная проблема – это «маленькие, глупые» ошибки парсера, которые, к сожалению, не появляются.

Однако, когда файл .PHP-файл содержит файл с ошибками парсера, они отображаются! Поэтому у меня возникла идея написать небольшой «сценарий-исполнитель», который запускается с именем багги-файла в качестве аргумента, то есть example.com/sx.php?sc=buggy.php

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

sx.php

 $sc = $_GET["sc"]; if ((!isset($_GET["sc"]) && empty($_GET["sc"]))) { echo "Please select file to execute using ?sc= (you may omit the .PHP-extension)"; } else { $sc = $_GET["sc"]; if (false==stripos('.php',$sc)) $sc.='.php'; // adjust this if your preferred extension is php5! require($sc); } ?>