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

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

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

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

29 ответов


для синтаксических ошибок необходимо включить отображение ошибок в php.ini. По умолчанию они отключены, потому что вы не хотите, чтобы "клиент" видеть сообщения об ошибках. проверять эту страницу в документации PHP для получения информации о 2 директивах:error_reporting и display_errors. display_errors - Это, наверное, тот, который вы хотите изменить. Если вы не можете изменить php.Ини, вы можете добавить следующие строки в .файл 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 и интегрируется непосредственно в Редактор, поэтому вы используете 1 программу для всего.)

Картмана ссылке также очень хорошо: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 (начиная с PHP 5.3) по умолчанию установлено значение E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED (это означает, что все показано, за исключением уведомлений, строгих стандартов и уведомлений об устаревании). Если вы сомневаетесь, установите его в E_ALL на экране все ошибки. Регистрация!

Воу воу! Нет чека! Я не могу изменить свой php.Ини!

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

настройки во время выполнения

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

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

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

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

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

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

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

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

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


есть очень полезное расширение под названием "xdebug


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

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

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

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

далее вещи для рассмотрения:

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

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


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

$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);

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

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


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

error_reporting(E_ERROR | E_WARNING | E_PARSE);

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

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

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

display_errors = stdout

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

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


рекомендую Нетте Трейси для лучшей визуализации ошибок и исключений в PHP:

Nette Tracy screenshot


error_reporting(E_ALL | E_STRICT);

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


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

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');

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


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


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

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

как указывали другие участники, они отключены по умолчанию По соображениям безопасности. В качестве полезного совета - при настройке сайта удобно сделать переключатель для разных сред, чтобы эти ошибки были включены по умолчанию в локальной среде и среде разработки. Это может быть достигнуто с помощью следующего кода (в идеале в индексе.файл 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;
}

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


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

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

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


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

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

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

error_reporting(E_ALL);

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

ini_set('display_errors', '1');

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


помимо error_reporting и параметра display_errors ini, вы можете получить синтаксические ошибки из файлов журнала вашего веб-сервера. Когда я разрабатываю 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) { /* ... */

to

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

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


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

смертельный Ошибки:

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

Backtracing:

debug_backtrace

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


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


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

для того, чтобы...

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

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

MySQLi

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

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

это лучше, прежде чем использовать new mysqli() или mysqli_connect().

PDO

установить до 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);

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

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

это уже спасло меня от большой головной боли, может быть, это будет полезно кому-то еще :)

sx.РНР

$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);
}
?>