Как получить ошибки PHP для отображения?

1512

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

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

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

Что нужно делать?

  • 7
    Я еще точно не знаю, почему это работает иногда, а не другие, но для тех, кто хочет быстро переключать ошибки в php-скрипте (или включать их с помощью параметра $_REQUEST ), эти две строки будут работать большую часть времени.
  • 0
    Вы можете увидеть подробности ошибки, включив xdebug из phi ini-файла.
Показать ещё 3 комментария
Теги:

26 ответов

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

Это всегда работает для меня:

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

Однако это не делает PHP для выявления ошибок синтаксического анализа - единственный способ показать эти ошибки - это изменить ваш php.ini с помощью этой строки:

display_errors = on
  • 5
    Также обратите внимание, что вы можете использовать эти 3 строки, а затем включить ('fileImWorkingOn.php') ;. Тогда вы можете поймать синтаксические ошибки тоже!
  • 4
    Это не будет отображать ошибки разбора
Показать ещё 15 комментариев
145

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

Этот вопрос может предоставить дополнительную информацию.

  • 1
    Не знал этого. Я отредактировал файл php.ini вручную, и теперь он работает. Спасибо!
132

Внутри php.ini:

display_errors = on

Затем перезапустите веб-сервер.

  • 8
    +1. На моем Mac: /etc/php.ini
  • 7
    + ①. На моем Ubuntu /etc/php5/apache2/php.ini
Показать ещё 4 комментария
87

Чтобы отобразить все ошибки, вам необходимо:

1. Возьмите эти строки в скрипте PHP, который вы вызываете из браузера (обычно index.php):

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

2. (a) Убедитесь, что этот скрипт не имеет синтаксических ошибок

-или же-

2. (b) Установите display_errors = On в свой php.ini

В противном случае он не может даже запустить эти 2 строки!

Вы можете проверить наличие синтаксических ошибок в вашем скрипте, выполнив (в командной строке):

php -l index.php

Если вы включите скрипт из другого скрипта PHP, он отобразит синтаксические ошибки во включенном скрипте. Например:

index.php

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

// Any syntax errors here will result in a blank screen in the browser

include 'my_script.php';

my_script.php

adjfkj // This syntax error will be displayed in the browser
41

Некоторые провайдеры веб-хостинга позволяют изменять параметры PHP в файле .htaccess.

Вы можете добавить следующую строку:

php_value display_errors 1

У меня была та же проблема, что и у вас, и это решение исправило ее.

  • 2
    Не php_flag ? т.е.: php_flag display_errors on
  • 2
    Я попытался это и получил 500 внутренних ошибок сервера.
Показать ещё 1 комментарий
32

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

try{
     // Your code
} 
catch(Error $e) {
    $trace = $e->getTrace();
    echo $e->getMessage().' in '.$e->getFile().' on line '.$e->getLine().' called from '.$trace[0]['file'].' on line '.$trace[0]['line'];
}

Или, чтобы перехватывать исключения и ошибки за один раз (это не обратно совместимо с PHP 5):

try{
     // Your code
} 
catch(Throwable $e) {
    $trace = $e->getTrace();
    echo $e->getMessage().' in '.$e->getFile().' on line '.$e->getLine().' called from '.$trace[0]['file'].' on line '.$trace[0]['line'];
}
  • 0
    Было бы неплохо показать трассировку, а также
  • 1
    Вы имеете в виду PHP7 или PHP7.1? Я в замешательстве, я попробовал как предложенный проверенный ответ, и он работает, я думаю, что вы предлагаете что-то немного другое ИМХО, действительно "нет обратной совместимости", и если вам нужно изменить полный код PHP <7 и нужно добавить try{} catch() {} код везде в вашем уже определенном php-коде, я даже не хочу думать о беспорядке, который произойдет ..
Показать ещё 8 комментариев
27

Использование:

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

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

php -l phpfilename.php
26

Это будет работать:

<?php
     error_reporting(E_ALL);
     ini_set('display_errors', 1);    
?>
16

Установите это в вашем файле index.php:

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

Создайте файл с именем php.ini в папке, где находится ваш PHP файл.

Внутри php.ini добавьте следующий код (я даю простую ошибку, показывающую код):

display_errors = on

display_startup_errors = on
13

Вот сценарий 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 - error_reporting().

  • 2
    Чем это отличается от ответа Фэнси Джона?
11

Если, несмотря на все приведенные выше ответы (или вы не можете отредактировать файл 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 not sure which 'x' class to use
class x {
    ...
}
  • 1
    Нет, сообщение об ошибке - это не уровень логирования, а битовое поле. Использование 999999 - очень плохая идея, используйте некоторую степень двух минус 1, например 2047!
  • 0
    Вы абсолютно правы, @peterh! Я изменил его на E_ALL, так как это позволит сообщать обо всех ошибках (кроме строгих ошибок в php 5.4 и ниже).
10

При использовании 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

9

Поскольку мы сейчас работаем с 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

9

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

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

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

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

  • 0
    Что такое «основной индексный файл» ? Файл index.html ?
  • 0
    Файл index.php будет иметь этот код
9

Если вы каким-то образом окажетесь в ситуации, когда вы не можете модифицировать настройку с помощью 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.";
}
  • 0
    find . -name '*.php' -type f -exec php -l {} \; | grep -v 'No syntax errors detected' проще
7

Я бы обычно использовал следующий код в моем простом 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.');
    }
}
6

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

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)."</pre> <br>";

    echo $msg;

    return false;
}

function EXC_HANDLER($exception){
    ERR_HANDLER(0, $exception->getMessage(), $exception->getFile(), $exception->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");
3

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

try {
    // Page code
}
catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}
  • 0
    Для php7 лучше использовать catch (Throwable $e) ... Или другой блок catch(Error $e) под catch(Error $e)
2

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

error_reporting(E_ALL);

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

error_reporting =on
1
<?php
// Turn off error reporting
error_reporting(0);

// Report runtime errors
error_reporting(E_ERROR | E_WARNING | E_PARSE);

// Report all errors
error_reporting(E_ALL);

// Same as error_reporting(E_ALL);
ini_set("error_reporting", E_ALL);

// Report all errors except E_NOTICE
error_reporting(E_ALL & ~E_NOTICE);
?

>

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

  • 1
    Чем этот ответ лучше принятого?
  • 0
    @hello, имеет комментарии и отформатирован понятным способом.
1

Вот чему я научился. В файле PHP.INI

error_reporting = E_ALL
display_errors = On
  • 0
    Меняется? Добавление к?
1

Просто напишите:

error_reporting(-1);
0

Вы можете использовать этот код:

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

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

xdebug.force_display_errors = 1;
xdebug.force_error_reporting = -1;

force_display_errors

Тип: int, Значение по умолчанию: 0, Введено в Xdebug> = 2.3. Если для этого параметра установлено значение 1, ошибки будут отображаться всегда, независимо от значения PHP display_errors.

force_error_reporting

Тип: int, Значение по умолчанию: 0, Введено в Xdebug> = 2.3 Этот параметр является битовой маской, как error_reporting. Эта битовая маска будет логически ИЛИ с битовой маской, представленной error_reporting, чтобы определить, какие ошибки должны отображаться. Этот параметр может быть установлен только в php.ini и позволяет принудительно отображать определенные ошибки независимо от того, что приложение делает с ini_set().

-2

Ещё вопросы

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