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

498

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

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

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

Показать ещё 2 комментария
Теги:
error-handling
debugging

29 ответов

470
Лучший ответ

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

  • 0
    Может быть, вы просто отвергли двух человек, которые дали тот же совет, что и вы (см. Ваш второй пример кода)?
  • 3
    Вы прочитали весь мой ответ? Я специально говорю, что это не сработает из-за синтаксических ошибок, тогда как вы не упоминаете об этом. Размещение вашего кода не будет иметь никакого значения.
Показать ещё 8 комментариев
401

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

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

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

  • 26
    Лучше всего вносить эти изменения на уровне файла .ini. Включение отчетов об ошибках из скрипта бесполезно, так как это не поможет с ошибками синтаксиса или другими фатальными ошибками, которые убивают фазу компиляции. Сценарий уничтожается задолго до того, как он начинает выполняться и достигает переопределений отчетов.
  • 0
    Вы действительно правы. Я не заметил, что переезд на ваш собственный сервер.
Показать ещё 6 комментариев
54

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

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

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

  • 2
    Это не работает для синтаксических ошибок, как упоминала Кандидаса.
  • 2
    Это правда. В этом случае значения должны быть установлены в ini напрямую - для чистой среды разработки это может быть предпочтительнее в любом случае.
Показать ещё 1 комментарий
49

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

26

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

  • 2
    Действительно, это очень полезный инструмент отладки - делает сообщения об ошибках гораздо более подробными, с полными трассировками стека, дампами переменных и всем остальным.
  • 2
    Да. А затем используйте что-то вроде плагина VimDebugger, чтобы пройтись по коду и выяснить, где он идет не так.
Показать ещё 3 комментария
21

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

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

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

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

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

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

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

15

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

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

  • 1
    Это то, что я ищу! :) Почему никто не дал это upvote? Отладка веб-сайта необходима только веб-мастеру, а не клиенту. Так что запускать его локально лучше для безопасности.
  • 2
    Если вы проводите различие между локальной и производственной средами, вам следует просто включить или отключить ошибки глобально (в вашем php.ini), а не в коде, который также может быть производственным кодом. Если вам нужно отладить производственный веб-сайт в его производственной среде и вы хотите, чтобы вы могли только просматривать ошибки, используйте $_SERVER['REMOTE_HOST'] чтобы проверить, является ли клиент именно вами.
14

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

error_reporting(E_ERROR | E_WARNING | E_PARSE);
12

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

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

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

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

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

  • 0
    Xdebug можно включить из php.ini
10

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

Изображение 743

  • 1
    Это не отвечает на вопрос ...
  • 3
    Трейси позаботится о правильной настройке всех отображаемых ошибок и опций сообщения об ошибках, чтобы обеспечить вывод в таких ситуациях, как описано в оригинальном сообщении ... Так что этот инструмент особенно полезен для решения вопроса "Может ли кто-нибудь порекомендовать хорошие советы по отладке PHP, инструменты и методы? ».
8
error_reporting(E_ALL | E_STRICT);

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

7

Вы можете зарегистрировать свой собственный обработчик ошибок в 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');
  • 0
    Это не работает для синтаксических ошибок, как упоминала Кандидаса.
  • 0
    Да, но это уже описано во всех других ответах.
6

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

6

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

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

5

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

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

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

5

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

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

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

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

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

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

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

3

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

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

error_reporting(E_ALL);

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

ini_set('display_errors', '1');

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

  • 0
    Как и в случае с ответом Томалака, это не работает для синтаксических ошибок.
3

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

В дополнение ко всем замечательным ответам здесь я хотел бы особо упомянуть библиотеки 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);
0

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

  • 0
    404 Не Найдено...
  • 0
    да, это было давно, ссылка обновлена сейчас. @YoushaAleayoub
0

В дополнение к очень большому количеству превосходных ответов выше вы также можете реализовать следующие две функции в своих проектах. Они будут улавливать каждую несинтаксическую ошибку до выхода приложения /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

0

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

0

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

Таким образом, я всегда создаю файл/программу (которую я обычно называю "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) { /* ... */
-1

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

Однако, когда файл .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);
}
?>
  • 0
    Ненавижу быть таким парнем, но это плохой пример. Локальное включение файлов
  • 1
    Вы правы - этот механизм не должен использоваться для производства, это просто инструмент для выявления этих вещей при разработке / отладке / тестировании.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню