Как получить ошибки PHP для отображения? - PullRequest
1574 голосов
/ 27 июня 2009

Я проверил мой файл инициализации PHP (php.ini) и установил ошибки отображения, а также отчет об ошибках E_ALL. Я перезапустил свой веб-сервер Apache.

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

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

Что осталось сделать?

Ответы [ 26 ]

16 голосов
/ 11 января 2016

Вот скрипт PHP:

<?php
    ini_set("display_startup_errors", 1);
    ini_set("display_errors", 1);

    /* Reports for either E_ERROR | E_WARNING | E_NOTICE  | Any Error*/
    error_reporting(E_ALL);

    echo(abc); /* Notice: abc is an undefined constant */
?>

Для более подробного объяснения ошибок PHP, посетите Ошибка PHP - error_reporting () .

14 голосов
/ 24 апреля 2015

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

error_reporting(E_ALL);
ini_set('display_errors', 1);
require_once('problem_file.php');

Несмотря на то, что в моем файле php.ini все настроено правильно, это был единственный способ обнаружить ошибку пространства имен. Мой точный сценарий был:

//file1.php
namespace a\b;
class x {
    ...
}

//file2.php
namespace c\d;
use c\d\x; //Dies because it's not sure which 'x' class to use
class x {
    ...
}
13 голосов
/ 28 января 2014

При использовании PHP в качестве модуля Apache мы можем изменить параметры конфигурации с помощью директив в файлах конфигурации Apache (например, httpd.conf) и файлах .htaccess. Для этого вам потребуются привилегии «AllowOverride Options» или «AllowOverride All».

Проверьте это

http://funbird.co.uk/blog/tech-articals/linux-tech-articals/enabling-error-display-php-via-htaccess

12 голосов
/ 20 мая 2017

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

С другой стороны, вместо того, чтобы пытаться ловить ошибки с помощью try / catch, вы можете использовать хитрость: используйте include.

Вот три куска кода:

Файл: tst1.php

<?php
    error_reporting(E_ALL);
    ini_set('display_errors', 'On');
    // Missing " and ;
    echo "Testing
?>

Запуск этого в PHP 7 ничего не покажет.

Теперь попробуйте это:

Файл: tst2.php

<?php
    error_reporting(E_ALL);
    ini_set('display_errors', 'On');
    include ("tst3.php");
?>

Файл: tst3.php

<?php
    // Missing " and ;
    echo "Testing
?>

Теперь запустите tst2, который устанавливает отчет об ошибках, а затем включите tst3. Вы увидите:

Ошибка разбора: синтаксическая ошибка, неожиданный конец файла, ожидаемая переменная (T_VARIABLE) или $ {(T_DOLLAR_OPEN_CURLY_BRACES) или {$ (T_CURLY_OPEN) в tst3.php в строке 4

12 голосов
/ 11 января 2016

Если вы каким-то образом оказались в ситуации, когда вы не можете изменить настройку с помощью php.ini или .htaccess, вам не повезло, если вы отображаете ошибки, когда ваши PHP-скрипты содержат ошибки синтаксического анализа. Затем вам придется разрешить пометить файлы в командной строке следующим образом:

find . -name '*.php' -type f -print0 | xargs -0 -n1 -P8 php -l | grep -v "No syntax errors"

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

<?php
if( !ini_set( 'display_errors', 1 ) ) {
  echo "display_errors cannot be set.";
} else {
  echo "changing display_errors via script is possible.";
}
11 голосов
/ 01 февраля 2017

Вы можете сделать что-то вроде ниже:

Установите следующие параметры в вашем основном индексном файле:

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

Затем на основе ваших требований вы можете выбрать, что вы хотите показать:

Для всех ошибок, предупреждений и уведомлений:

    error_reporting(E_ALL); OR error_reporting(-1);

Для все ошибки:

    error_reporting(E_ERROR);

Для всех предупреждений:

    error_reporting(E_WARNING);

Для всех уведомлений:

    error_reporting(E_NOTICE);

Для получения дополнительной информации, проверьте здесь .

11 голосов
/ 01 февраля 2017

Я бы обычно использовал следующий код в моем простом PHP-проекте, который очень мал. Если проект станет большим, я порекомендую:

if(!defined('ENVIRONMENT')){
    define('ENVIRONMENT', 'DEVELOPMENT');
}

$base_url = null;

if (defined('ENVIRONMENT'))
{
    switch (ENVIRONMENT)
    {
        case 'DEVELOPMENT':
            $base_url = 'http://localhost/product/';
            ini_set('display_errors', 1);
            ini_set('display_startup_errors', 1);
            error_reporting(E_ALL|E_STRICT);
            break;

        case 'PRODUCTION':
            $base_url = 'Production URL'; /* https://google.com */
            error_reporting(0);
            /* Mechanism to log errors */
            break;

        default:
            exit('The application environment is not set correctly.');
    }
}
10 голосов
/ 04 июня 2017

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

<code>function ERR_HANDLER($errno, $errstr, $errfile, $errline){
    $msg = "<b>Something bad happened.</b> [$errno] $errstr <br><br>
    <b>File:</b> $errfile <br>
    <b>Line:</b> $errline <br>
    <pre>".json_encode(debug_backtrace(), JSON_PRETTY_PRINT)."

"; echo $ msg; вернуть ложь; } функция EXC_HANDLER ($ исключение) { ERR_HANDLER (0, $ exception-> getMessage (), $ exception-> getFile (), $ception-> getLine ()); } function shutDownFunction () { $ error = error_get_last (); if ($ error ["type"] == 1) { ERR_HANDLER ($ error ["type"], $ error ["message"], $ error ["file"], $ error ["line"]); } } set_error_handler ("ERR_HANDLER", E_ALL & ~ E_NOTICE & ~ E_STRICT & ~ E_DEPRECATED); register_shutdown_function ( "shutdownFunction"); set_exception_handler ( "EXC_HANDLER");
6 голосов
/ 09 мая 2017

Этот код сверху должен работать:

error_reporting(E_ALL);

Однако попробуйте отредактировать код на телефоне в файле:

error_reporting =on
6 голосов
/ 27 марта 2017

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

try {
    // Page code
}
catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}
...