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

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

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

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

1925
Abs 27 Июн 2009 в 23:09
10
Мне еще предстоит точно понять, почему это работает иногда, а не другие, но для тех, кто хочет быстро переключать ошибки в php-скрипте (или включать их с помощью параметра $_REQUEST), эти две строки будут работать большую часть времени .
 – 
brandonscript
29 Окт 2013 в 00:15
Хорошо, вы можете увидеть подробности ошибки, включив xdebug из файла php ini.
 – 
jewelhuq
13 Янв 2016 в 13:14
1
Наиболее специфичные редакторы/IDE, такие как, например. Notepad ++, Eclipse имеют встроенную проверку и подсветку синтаксиса. Они покажут вам проблемы, подобные описанным вами. Пожалуйста, не включайте отображение ошибок в работающей системе. Хакерам это понравится, потому что в большинстве случаев показаны пути. Вы можете определить обработчик ошибок/исключений. В этом обработчике вы можете зарегистрировать проблему и отправить письмо разработчику, чтобы он мог исправить ее сразу же при возникновении проблемы. см. php.net/manual/en/function.set-error -handler.php и php.net/manual /en/function.set-exception-handler.php
 – 
Alexander Behling
10 Дек 2020 в 11:08

30 ответов

Лучший ответ

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

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
3469
anthonyryan1 14 Май 2020 в 03:32
11
Также обратите внимание, что вы можете использовать эти 3 строки, а затем включить ('fileImWorkingOn.php');. Тогда вы сможете поймать и синтаксические ошибки!
 – 
Snap
8 Май 2015 в 21:11
18
Хотя я не SysOps, я думаю, что у большего количества людей есть файл .htaccess, чем php.ini, и оба они будут перед синтаксическим анализом, верно? php_flag display_errors 1 для .htaccess
 – 
Ryan Taylor
10 Июл 2015 в 00:58
3
E_ALL недостаточно для отображения всех ошибок в PHP 5.3. «E_STRICT стал частью E_ALL в версии 5.4.0» — Руководство по PHP В этой версии вам потребуется E_ALL | E_STRICT или -1.
 – 
Gerard Roche
14 Сен 2016 в 07:12
6
Чувак, я собираюсь татуировать эти три линии.
 – 
Juan C. Roldán
26 Май 2021 в 01:42
6
@JuanC.Roldán Я буквально возвращаюсь к этому ответу три раза в неделю.
 – 
glinda93
30 Сен 2021 в 15:45

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

display_errors = on

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

153
j0k 8 Янв 2013 в 13:48
8
+①. На моей Ubuntu /etc/php5/apache2/php.ini
 – 
m93a
23 Фев 2015 в 20:44
7
Для перезагрузки (Debian, Ubuntu и т. д.) sudo service apache2 restart
 – 
Peter Krauss
1 Сен 2015 в 16:04
4
Для перезагрузки в OS X sudo apachectl -k restart.
 – 
Pea
10 Янв 2016 в 22:53
4
Забавный факт: вы можете найти загруженный файл php.ini, если просто введете phpinfo(); в пустой файл php. это 7-й ряд вниз и называется Loaded Configuration File
 – 
Frankenmint
24 Июл 2016 в 07:56
Это не работает для меня. На самом деле я могу вызвать ini_get('display_errors'), и он вернет пустую строку (что означает, что он отключен). И да, я проверил, чтобы убедиться, что это единственная строка в файле конфигурации. Настройка каким-то образом переопределяется, и я не могу понять, почему, и это сводит меня с ума. Да, я все перерыл в /etc/php.d/, и это тоже не один из этих файлов. Да, я тоже перезапустил веб-сервер. Нет, в файле .htaccess ничего нет. Я использую PHP 7.4.6.
 – 
cazort
3 Авг 2021 в 21:07

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

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
106
andre 8 Окт 2018 в 17:44
Все, что я получаю при выполнении php -l phpfilename.php, - это сообщение «Ошибки синтаксического анализа sql_lab.php». Он не говорит мне, что это за ошибки.
 – 
KevinHJ
23 Июл 2021 в 05:33
В дополнение к пустому экрану он вернет ошибку 500, которую гораздо безопаснее измерить, чем просто отсутствие контента.
 – 
Chris S.
22 Дек 2021 в 02:04

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

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

php_value display_errors 1

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

54
Peter Mortensen 17 Фев 2019 в 12:34
И если вы находитесь в среде nginx, добавьте значение php в конфигурацию вашего сайта (сайты доступны) в директиве location ~\.php. fastcgi_param PHP_VALUE " error_reporting=E_ALL;\n display_errors=1;";
 – 
Lazaros Kosmidis
9 Окт 2018 в 10:25

Вы можете обнаружить, что все настройки для «отчетов об ошибках» или «ошибок отображения» не работают в 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'];
}
44
Frank Forte 6 Июн 2017 в 21:32
1
Вы имеете в виду PHP7 или PHP7.1? Я в замешательстве, я попробовал предложенный проверенный ответ, и он работает, я думаю, вы предлагаете что-то немного другое ИМХО, действительно «без обратной совместимости», и если вам нужно изменить полный код PHP <7 и нужно добавить try{} catch() {} код повсюду в вашем уже определенном php-коде, я даже не хочу думать о беспорядке, который будет..
 – 
vdegenne
22 Янв 2017 в 14:22
@FancyJohn, это может помочь: $bt = debug_backtrace(); print_r($bt);.
 – 
Frank Forte
23 Мар 2017 в 06:25
@ballangddang, я столкнулся с проблемой в PHP 7.0, где единственным способом отобразить ошибку было использование блоков try/catch и, в частности, перехват Error. Если вы переписываете все запросы (кроме, может быть, JavaScript, CSS, изображений и т. д.) в файл index.php, то держите там блок try catch, это упрощает задачу. Да, любая система, не имеющая единой точки входа, будет серьезной головной болью при обновлении.
 – 
Frank Forte
23 Мар 2017 в 06:28
Разве PHP не показывает необработанные исключения? Уверен, что да?
 – 
Martin Tournoij
5 Июн 2017 в 05:20
Он должен показывать необработанные исключения. Если вы включите выходной буфер в начале (чтобы вы могли отправлять заголовки в любой момент, прежде чем окончательно сбросить тело ответа), возможно, сообщение об исключении может где-то потеряться.
 – 
Frank Forte
19 Авг 2017 в 06:04

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

<?php
     error_reporting(E_ALL);
     ini_set('display_errors', 1);    
?>
35
Peter Mortensen 27 Дек 2016 в 18:20
Октябрь 2020: Это сработало для меня. Так просто. Не возитесь с .htaccess или php.ini. Когда вы закончите, просто закомментируйте или удалите его. PHP 7.4
 – 
Rob Moll
23 Окт 2020 в 17:18

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

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

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

php -l phpfilename.php
34
Peter Mortensen 27 Дек 2016 в 18:27

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

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

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

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

display_errors = on

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

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

16
Peter Mortensen 17 Фев 2019 в 12:18
1
Я потратил некоторое время, чтобы понять это. Почему они изменили поведение php 5?
 – 
Hebe
17 Дек 2020 в 23:41

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

Если, несмотря на выполнение всех вышеперечисленных ответов (или вы не можете отредактировать файл 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 в 05:48
1
Нет, сообщение об ошибке — это не уровень журнала, это битовое поле. Использование 999999 — очень плохая идея, используйте степень двойки минус 1, например 2047!
 – 
peterh
17 Июл 2018 в 16:32
Ты абсолютно прав, @peterh! Я изменил его на E_ALL, так как это позволит сообщать обо всех ошибках (кроме строгих ошибок в php 5.4 и ниже).
 – 
jxmallett
18 Июл 2018 в 05:52

Если вы каким-то образом оказались в ситуации, когда вы не можете изменить настройку с помощью 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 в 15:11
find . -name '*.php' -type f -exec php -l {} \; | grep -v 'No syntax errors detected' проще
 – 
scones
24 Ноя 2017 в 16:27

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

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

    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 в 12:26
Что такое "основной индексный файл"? Файл index.html?
 – 
Peter Mortensen
17 Фев 2019 в 12: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 в 12:17

Ответ принят, включая дополнительные параметры. В файлах PHP для моего виртуального хоста РАЗРАБОТКИ apache (.htaccess, если вы можете гарантировать, что он не попадет в производство):

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

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

display_errors = on

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

// I've added some extra options that set E_ALL as per https://www.php.net/manual/en/errorfunc.configuration.php.
php_flag log_errors on
php_flag display_errors on
php_flag display_startup_errors on
php_value error_reporting 2147483647
php_value error_log /var/www/mywebsite.ext/logs/php.error.log
9
webcoder.co.uk 9 Янв 2022 в 01:17

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

error_reporting(E_ALL);

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

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

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

try {
    // Page code
}
catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}
6
Peter Mortensen 17 Фев 2019 в 12:23
Для php7 лучше использовать catch (Throwable $e)... Или другой блок catch под catch(Error $e)
 – 
Frank Forte
19 Авг 2017 в 05:58
    <?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 в 14:36

Вы можете сделать это, изменив файл 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 в 11: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 в 12:13

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

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
3
baduker 28 Мар 2019 в 17: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 в 13:07

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

php -ddisplay_errors=1 script.php
2
Peter Mortensen 22 Апр 2020 в 17:44
     error_reporting(1);
     ini_set('display_errors', '1');
     ini_set('display_startup_errors', '1');
     error_reporting(E_ALL);

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

2
Kwed 28 Фев 2021 в 03:51

Введите это в верхней части кода

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

И в файле php.ini вставьте это:

display_errors = on

Это должно сработать.

2
ropehapi 24 Авг 2021 в 00:22

Вы можете показать ошибку 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 в 09: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 5 Дек 2020 в 02:56
Как это отвечает на этот вопрос о PHP?
 – 
Peter Mortensen
22 Апр 2020 в 17:45
./script – это скрипт php CLI (hashbang #!/usr/bin/php). Таким образом вы можете перенаправить ошибки php в файл. Это unix-конвейер. Это не php как CGI.
 – 
NVRM
22 Апр 2020 в 23:57

Просто пиши:

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

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

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

161
Community 23 Май 2017 в 15:26