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

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

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

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

1880
Abs 27 Июн 2009 в 23:09

28 ответов

Лучший ответ

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

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

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

display_errors = on

(если у вас нет доступа к php.ini, то включение этой строки в .htaccess тоже может сработать):

php_flag display_errors 1
3365
anthonyryan1 14 Май 2020 в 00:32

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

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

157
Community 23 Май 2017 в 12:26

Внутри вашего php.ini :

display_errors = on

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

147
j0k 8 Янв 2013 в 09:48

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

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

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

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

—или—

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
101
andre 8 Окт 2018 в 14:44

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

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

php_value display_errors 1

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

53
Peter Mortensen 17 Фев 2019 в 09:34

Вы можете обнаружить, что все настройки для «отчетов об ошибках» или «ошибок отображения» не работают в 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'];
}
41
Frank Forte 6 Июн 2017 в 18:32

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

<?php
     error_reporting(E_ALL);
     ini_set('display_errors', 1);    
?>
35
Peter Mortensen 27 Дек 2016 в 15:20

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

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

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

php -l phpfilename.php
33
Peter Mortensen 27 Дек 2016 в 15:27

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

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
22
Peter Mortensen 17 Фев 2019 в 09:14

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

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

display_errors = on

display_startup_errors = on
20
Peter Mortensen 27 Дек 2016 в 15:21

Если, несмотря на выполнение всех вышеперечисленных ответов (или вы не можете отредактировать файл 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 {
    ...
}
15
jxmallett 18 Июл 2018 в 02:48

Обычно я использую следующий код в моих простых проектах 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.');
    }
}
15
Channaveer Hakari 13 Сен 2019 в 09:09

Если вы каким-то образом оказались в ситуации, когда вы не можете изменить настройку с помощью 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.";
}
14
chiborg 11 Янв 2016 в 12:11

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

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

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

Дополнительную информацию см. здесь.

13
Peter Mortensen 17 Фев 2019 в 09:26

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

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");
12
Peter Mortensen 17 Фев 2019 в 09:17

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

error_reporting(E_ALL);

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

error_reporting =on
7
Peter Mortensen 17 Фев 2019 в 09:21

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

try {
    // Page code
}
catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}
6
Peter Mortensen 17 Фев 2019 в 09:23
    <?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 можно включить для устранения неполадок.

5
Lahiru Mirihagoda 29 Май 2019 в 11:36

Просто пиши:

error_reporting(-1);
4
jewelhuq 13 Янв 2017 в 18:56

Вы можете сделать это, изменив файл php.ini и добавив следующие

display_errors = on
display_startup_errors = on

ИЛИ вы также можете использовать следующий код, так как это всегда работает для меня

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
4
Muhammad Adeel Malik 28 Июн 2019 в 08:26

Если у вас установлен 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 ().

3
Peter Mortensen 17 Фев 2019 в 09:13

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

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
3
baduker 28 Мар 2019 в 14:02

Сообщать обо всех ошибках, кроме E_NOTICE

error_reporting(E_ALL & ~E_NOTICE);

Показать все ошибки PHP

error_reporting(E_ALL);  or ini_set('error_reporting', E_ALL);

Отключить все отчеты об ошибках

error_reporting(0);
2
Shaikh Nadeem 31 Дек 2019 в 10:07

Если он указан в командной строке, вы можете запустить php с -ddisplay_errors=1, чтобы переопределить настройку в php.ini:

php -ddisplay_errors=1 script.php
2
Peter Mortensen 22 Апр 2020 в 14:44

Вы можете показать ошибку Php на экране простыми способами. Во-первых, просто поместите приведенный ниже код в свой файл php.ini.

display_errors = on;

(если у вас нет доступа к php.ini, то можно добавить эту строку в .htaccess):

php_flag display_errors 1

ИЛИ вы также можете использовать следующий код в своем файле index.php

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
1
Devsaiful 6 Ноя 2020 в 06:41

В CLI Unix очень удобно перенаправить только ошибки в файле:

./script 2> errors.log

В вашем скрипте либо используйте var_dump(), либо эквивалентное, как обычно (оба STDOUT и STDERR получат вывод), но для записи только в файл журнала :

fwrite(STDERR, "Debug infos\n"); // Write in errors.log^

Затем из другой оболочки для живых изменений:

tail -f errors.log

Или просто

watch cat errors.log
1
NVRM 4 Дек 2020 в 23:56
     error_reporting(1);
     ini_set('display_errors', '1');
     ini_set('display_startup_errors', '1');
     error_reporting(E_ALL);

Поместите это вверху вашей страницы.

0
Kwed 28 Фев 2021 в 00:51