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

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

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

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

Ответы

Ответ 1

Для синтаксических ошибок вам нужно включить отображение ошибок в 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 программу для выполнения всего.)

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

Ответ 3

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

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

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

Ответ 4

Конфигурация 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.

Ответ 5

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

Ответ 6

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

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

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

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

Далее следует рассмотреть:

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

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

Ответ 7

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

$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 для использования в других местах, где это необходимо.

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

Ответ 8

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

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

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

display_errors = stdout

Ответ 9

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

error_reporting(E_ERROR | E_WARNING | E_PARSE);

Ответ 10

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

Nette Tracy screenshot

Ответ 11

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

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

Ответ 12

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

Ответ 13

error_reporting(E_ALL | E_STRICT);

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

Ответ 14

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

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

Ответ 16

Две ключевые строки, необходимые для получения полезных ошибок из 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;
}

Ответ 17

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

Ответ 18

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

Ответ 19

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

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

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

Ответ 20

Вы можете включить полное сообщение об ошибках (включая уведомления и строгие сообщения). Некоторые люди считают это слишком многословным, но стоит попробовать. Установите error_reporting в 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, установите ее в On:

display_errors = "On"

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

display_errors = "stderr"

Ответ 21

Чтобы включить полное сообщение об ошибках, добавьте его в свой script:

error_reporting(E_ALL);

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

ini_set('display_errors', '1');

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

Ответ 22

Помимо параметров 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

Ответ 23

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

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

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

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

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

Ответ 24

В дополнение ко всем замечательным ответам здесь я хотел бы особо упомянуть библиотеки MySQLi и PDO.

Чтобы...

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

Лучший вариант - настроить библиотеки для исключения исключений.

MySQLi

Добавьте это в начало вашего скрипта

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

Это лучше всего использовать перед использованием new mysqli() или mysqli_connect().

PDO

Установите атрибут PDO::ATTR_ERRMODE в PDO::ERRMODE_EXCEPTION в вашем экземпляре подключения. Вы можете сделать это в конструкторе

$pdo = new PDO('driver:host=localhost;...', 'username', 'password', [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);

или после создания

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

Ответ 25

Этот ответ доведен до вас отделом резервирования.

  1. ini_set()/php.ini/.htaccess/.user.ini

    Настройки display_errors и error_reporting уже достаточно освещены. Но просто напомнить, когда использовать какую опцию:

    • ini_set() и error_reporting() применяются только для ошибок времени выполнения.
    • php.ini должен быть в первую очередь отредактирован для настроек разработки. (Web-сервер и CLI-версия часто имеют разные php.ini)
    • Флаги .htaccess работают только для устаревших установок (найдите нового хостера! Хорошо управляемые серверы дешевле.)
    • .user.ini - это частичный php.ini для современных установок (FCGI/FPM)

    И как грубая альтернатива для ошибок времени выполнения вы часто можете использовать:

    set_error_handler("var_dump");   // ignores error_reporting and '@' suppression
    
  2. error_get_last()

    Может использоваться для получения последнего уведомления о времени выполнения/предупреждения/ошибки, когда error_display отключен.

  3. $php_errormsg

    Суперлокальная переменная, которая также содержит последнее сообщение времени выполнения PHP.

  4. isset()

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

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

    if(isset($_POST['sumbit']))
    #                  ↑↑
    

    Вы не получите никаких полезных уведомлений, если ваш код усеян isset/empty/array_keys_exists. Иногда целесообразнее использовать @, поэтому уведомления и предупреждения, по крайней мере, идут в журналы.

  5. assert_options(ASSERT_ACTIVE|ASSERT_WARNING);

    Чтобы получить предупреждения для разделов assert(). (Довольно необычно, но более искусный код может содержать некоторые.)

    PHP7 также требует zend.assertions=1 в php.ini.

  6. declare(strict_types=1);

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

  7. PDO/MySQLi

    И @Phil уже упоминал о параметрах сообщения об ошибках PDO/MySQLi. Подобные опции существуют и для других API баз данных.

  8. json_last_error() + json_last_error_msg

    Для анализа JSON.

  9. preg_last_error()

    Для регулярных выражений.

  10. CURLOPT_VERBOSE

    Чтобы отлаживать запросы curl, вам нужно как минимум CURLOPT_VERBOSE.

  11. shell/exec()

    Аналогично, выполнение команды оболочки не приведет к ошибкам само по себе. Вам всегда нужны 2>&1 и посмотрите на $ errno.

Ответ 26

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

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

Есть два шага для реализации этой отладки:

Один - создайте genwrap.php и поместите в него этот код:

<?php
error_reporting(-1);
ini_set('display_errors', 'On');

include($_REQUEST['page']);
?>

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

Например: change:

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

к

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

Ответ 27

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

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

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

Ответ 28

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

Ответ 29

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

Однако, когда файл .PHP файл содержит файл с ошибками парсера, они отображаются! Поэтому у меня возникла идея написать небольшой "executor- script", который запускается с именем файла с ошибкой в ​​качестве аргумента, т.е. 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);
}
?>

Ответ 30

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