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

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

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

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

что остается делать?

24 ответов


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

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

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

display_errors = on

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

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


внутри php.ini:

display_errors = on

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


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

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

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

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

или

2.b) Set 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

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

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

php_value display_errors 1

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


вы можете обнаружить, что все настройки "отчеты об ошибках" или "ошибки отображения" не работают в 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'];
}

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

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

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

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

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

php -l phpfilename.php

установите это в свой .в PHP

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

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

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

display_errors = on

display_startup_errors = on

вот 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 ().


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


если вы каким-то образом окажетесь в ситуации, когда вы не можете изменить настройку через 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.";
}

If, несмотря на все приведенные выше ответы (или вы не можете редактировать свой 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 {
    ...
}

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

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

запуск этого в PHP7 ничего не покажет

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

: 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 on line 4


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

задайте ниже параметры в главном индексном файле

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

более подробная информация здесь


обычно я бы пошел со следующим кодом в моем простом проекте 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   =   'Prod url'; /* https://google.com */
            error_reporting(0);
            /* Mechanism to log errors */
            break;

        default:
            exit('The application environment is not set correctly.');
    }
}

надеюсь, что это помогает.


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

function ERR_HANDLER($errno ,$errstr, $errfile, $errline){
    $msg="<b>Someting 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");

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

try {

//Page code

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

надеюсь, это поможет.


этот код сверху должен работать error_reporting (E_ALL);

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

error_reporting =on


просто написать:

error_reporting(-1);

вот что я узнал. в PHP.INI файл

error_reporting = E_ALL
display_errors = On

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


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

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

force_display_errors

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

force_error_reporting

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