Как мне отобразить ошибки PHP?

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

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

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

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

Комментарии к вопросу (3)
Решение

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

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
Комментарии (17)

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

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

Комментарии (1)

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

display_errors = on

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

Комментарии (5)

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

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, то он отобразит синтаксические ошибки в скрипте included . Например:

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
Комментарии (0)

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

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

php_value display_errors 1

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

Комментарии (3)

Вы можете обнаружить, что все настройки для «отчетов об ошибках» или «об ошибках отображения» не работают в PHP & nbsp; 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 & nbsp; 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'];
}
Комментарии (10)

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

<?php
     error_reporting(E_ALL);
     ini_set('display_errors', 1);    
?>
Комментарии (0)

Использовать:

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

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

php -l phpfilename.php
Комментарии (0)

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

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
Комментарии (0)

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

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

display_errors = on

display_startup_errors = on
Комментарии (0)

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

Комментарии (2)

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

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

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

Комментарии (0)

Поскольку мы сейчас используем PHP 7, приведенные здесь ответы больше не верны. Единственный, кто все еще в порядке, это тот, что от Фрэнка Форте, когда он говорит о PHP & nbsp; 7.

С другой стороны, вместо того, чтобы пытаться поймать ошибки с помощью попытки / уловки, вы можете использовать трюк: используйте include.

Здесь три фрагмента кода:

Файл: tst1.php

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

Запуск этого в PHP & nbsp; 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

Комментарии (0)

Если вы каким-то образом оказались в ситуации, когда вы не можете изменить настройку с помощью 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.";
}
Комментарии (1)

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

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

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

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

Комментарии (2)

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

function ERR_HANDLER($errno, $errstr, $errfile, $errline){
    $msg = "Something bad happened. [$errno] $errstr <br><br>
    File: $errfile <br>
    Line: $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");
Комментарии (0)

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

error_reporting(E_ALL);

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

error_reporting =on
Комментарии (0)

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

try {
    // Page code
}
catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}
Комментарии (1)