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

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

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

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

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

27.06.2009 19:09:59
Мне еще предстоит точно определить, почему это работает иногда, а не другие, но для тех, кто хочет быстро переключать ошибки в php-скрипте (или включать их через $_REQUESTпараметр), эти две строки будут работать большую часть времени.
brandonscript 28.10.2013 20:15:16
хорошо вы можете увидеть детали ошибки, включив xdebug из phi ini-файла.
jewelhuq 13.01.2016 10:14:58
Bogdans 11.03.2019 12:51:55
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
3180
15.09.2019 16:08:48
Также обратите внимание, что вы можете использовать эти 3 строки, а затем включить ('fileImWorkingOn.php') ;. Тогда вы можете поймать синтаксические ошибки тоже!
Snap 8.05.2015 18:11:29
Хотя я и не являюсь SysOps, я думаю, что больше людей имеют файл .htaccess, чем php.ini, и они оба появятся перед разбором, верно? php_flag display_errors 1для .htaccess
Ryan Taylor 9.07.2015 21:58:58
Итак, теперь, когда ошибки регистрируются, куда они идут? Я пошел в / var / log / apache2, и он показывает все журналы, но нет никакой информации относительно программы, которую я недавно запустил. Я получаю информацию о перезагрузках системы только один раз каждое утро.
Michael 17.05.2016 15:14:28
@Michael Ошибки идут прямо на экран или туда, куда вывод перенаправлен
Fancy John 18.05.2016 05:35:24
E_ALLнедостаточно для отображения всех ошибок в PHP 5.3. " E_STRICTстало частью E_ALLв 5.4.0" - PHP Manual Вам нужно E_ALL | E_STRICTили -1в той версии.
Gerard Roche 14.09.2016 04:12:24

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

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

155
23.05.2017 12:26:34
Не знал этого. Я отредактировал файл php.ini вручную, и теперь он работает. Спасибо!
Abs 27.06.2009 19:16:52

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

display_errors = on

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

143
8.01.2013 09:48:33
+ ①. На моем Ubuntu /etc/php5/apache2/php.ini
m93a 23.02.2015 17:44:10
для перезапуска (Debian, Ubuntu и т. д.)sudo service apache2 restart
Peter Krauss 1.09.2015 13:04:26
Для перезагрузки на OS X sudo apachectl -k restart.
Pea 10.01.2016 19:53:17
Интересный факт: вы можете найти загруженный файл php.ini, если просто вставите phpinfo (); в пустой файл php. это 7-й ряд вниз и называетсяLoaded Configuration File
Frankenmint 24.07.2016 04:56:50
Как мы можем это сделать, если пишем директиву php-кода на cPanel?
arqam 29.08.2016 07:08:41

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

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

php_value display_errors 1

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

51
17.02.2019 09:34:04
А если вы находитесь в среде nginx, то добавьте значение php в конфигурацию вашего сайта (sites-available) в директиве location ~ \ .php. fastcgi_param PHP_VALUE "error_reporting = E_ALL; \ n display_errors = 1;";
Lazaros Kosmidis 9.10.2018 07:25:14

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

15
22.04.2020 14:39:23
Ссылка не работает (404).
Peter Mortensen 22.04.2020 14:39:37

Для отображения всех ошибок вам необходимо:

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

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

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

-или-

2. (б) Установите 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
98
8.10.2018 14:44:33

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

<?php
     error_reporting(E_ALL);
     ini_set('display_errors', 1);    
?>
33
27.12.2016 15:20:51

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

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

display_errors = on

display_startup_errors = on
20
27.12.2016 15:21:52

Если, несмотря на выполнение всех вышеприведенных ответов (или вы не можете отредактировать файл 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
18.07.2018 02:48:38
Нет, сообщение об ошибке - это не логарифмический уровень, это битовое поле. Использование 999999 - очень плохая идея, используйте некоторую степень двух минус 1, например 2047!
peterh - Reinstate Monica 17.07.2018 13:32:22
Вы абсолютно правы, @peterh! Я изменил его на E_ALL, так как это позволит сообщать обо всех ошибках (кроме строгих ошибок в php 5.4 и ниже).
jxmallett 18.07.2018 02:52:12

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

Вот скрипт 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 () .

18
27.12.2016 15:24:06
Чем это отличается от ответа Фэнси Джона ?
user369450 14.05.2016 16:22:12
@cpburnz - Это прямые вопросы, каждый из которых имеет одинаковый набор кодов в своем вкусе, с той лишь разницей. Я дал дополнительную ссылку URL, которая даст больше информации об ошибке PHP.
B.Balamanigandan 12.06.2019 05:13:22

Вы можете обнаружить, что все настройки для «сообщений об ошибках» или «отображать ошибки» не работают в 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'];
}
40
6.06.2017 18:32:06
Вы имеете в виду PHP7 или PHP7.1? Я в замешательстве, я попробовал как предложенный проверенный ответ, и он работает, я думаю, что вы предлагаете что-то немного другое, ИМХО, действительно "нет обратной совместимости", и если вам нужно изменить полный код PHP <7 и нужно try{} catch() {}везде добавлять код в вашем уже определенном php-коде, я даже не хочу думать, что беспорядок будет ...
vdegenne 22.01.2017 11:22:11
@FancyJohn, это может помочь: $bt = debug_backtrace(); print_r($bt);.
Frank Forte 23.03.2017 03:25:31
@ballangddang, я столкнулся с проблемой PHP 7.0, где единственный способ показать ошибку - использовать блоки try / catch и специально перехватывать Error. Если вы переписываете все запросы (за исключением, может быть, JavaScript, CSS, изображений и т. Д.) В файл index.php, то там есть блок try catch, это облегчает работу. Да, любая система, у которой нет единой точки входа, будет большой головной болью для обновления.
Frank Forte 23.03.2017 03:28:52
Разве PHP не показывает необработанные исключения? Вы уверены?
Martin Tournoij 5.06.2017 02:20:28
Это должно показать необработанные исключения. Если вы включаете выходной буфер в начале (чтобы вы могли отправлять заголовки в любой момент, прежде чем окончательно очистить тело ответа), возможно, сообщение об исключении может где-то потеряться.
Frank Forte 19.08.2017 03:04:27

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

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

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

php -l phpfilename.php
33
27.12.2016 15:27:08

Просто пиши:

error_reporting(-1);
4
13.01.2017 18:56:39

Я бы обычно использовал следующий код в моих простых проектах 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
13.09.2019 09:09:17

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

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

    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
17.02.2019 09:26:09
Что такое «основной индексный файл» ? Файл index.html?
Peter Mortensen 17.02.2019 09:26:38

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

try {
    // Page code
}
catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}
6
17.02.2019 09:23:53
Для php7 catch (Throwable $e)лучше ... Или еще один блок catch под нимcatch(Error $e)
Frank Forte 19.08.2017 02:58:11

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

error_reporting = E_ALL
display_errors = On
4
17.02.2019 09:22:31
Меняется? Добавление к?
Peter Mortensen 17.02.2019 09:22:55
Ваш ответ не имеет смысла, потому что в нем отсутствует контекст; также предусмотрено Питером Мортенсеном. Не улучшая его, он подготавливает его к «флагу для удаления» (ботами). (Из некачественного обзора).
ZF007 22.12.2019 11:07:55

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

error_reporting(E_ALL);

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

error_reporting =on
7
17.02.2019 09:21:23

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

14
17.02.2019 09:18:39

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

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
17.02.2019 09:17:21

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

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
22
17.02.2019 09:14:06

Если у вас установлен 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
17.02.2019 09:13:10
    <?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 можно включить для устранения неполадок.

4
29.05.2019 11:36:47

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

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
3
28.03.2019 14:02:28

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

Другие , чем php.iniи ini_set()функций в PHP скрипт, вы можете сделать это же самое с .htaccessи httpd.confдирективы показано ниже.

Некоторые хостинг-провайдеры позволяют устанавливать настройки PHP через .htaccessи httpd.conf.

Скрыть ошибки PHP

php_flag display_startup_errors ON

php_flag display_errors ON

php_flag html_errors ON

php_flag log_errors on

php_flag ignore_repeated_errors off

php_flag ignore_repeated_source off

php_flag report_memleaks on

php_flag track_errors on

php_value docref_root 0

php_value docref_ext 0

php_value error_log /home/path/public_html/domain/PHP_errors.log

php_value error_reporting 999999999

php_value error_reporting -1

php_value log_errors_max_len 0

Order allow,deny

Deny from all

Satisfy All
0
22.04.2020 14:43:19

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

php -ddisplay_errors=1 script.php
0
22.04.2020 14:44:08

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

./script 2> errors.log

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

tail -f errors.log

или просто

watch cat errors.log
0
22.04.2020 14:45:11
Как это отвечает на этот вопрос о PHP?
Peter Mortensen 22.04.2020 14:45:50
./scriptскрипт php CLI (hashbang #!/usr/bin/php) Таким способом вы можете перенаправить ошибки php в файл. Это Unix трубопровод. Это не php, как CGI.
NVRM 22.04.2020 20:57:51

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

error_reporting(E_ALL & ~E_NOTICE);

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

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

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

error_reporting(0);
2
31.12.2019 10:07:49