it-swarm.com.ru

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

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

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

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

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

1566
Abs

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

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

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

display_errors = on
2972
Fancy John

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

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

146
Michael Madsen

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

display_errors = on

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

131
user1803477

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

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, то он будет отображать синтаксические ошибки в включенный скрипт. Например:

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
90
andre

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

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

php_value display_errors 1

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

44
Kalhua

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

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

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

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

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

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

php -l phpfilename.php
29
Abhijit Jagtap

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

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
19
Sumit Gupta

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

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

display_errors = on

display_startup_errors = on
17
NavyaKumar

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

15
B.Balamanigandan

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

Используя 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

12
mike

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

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

11
Peter

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

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

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

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

11
Binit Ghetiya

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

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

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");
9
lintabá

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

error_reporting(E_ALL);

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

error_reporting =on
5
Wembo Mulumba

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

try {
    // Page code
}
catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}
5
Xakiru

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

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

Просто пиши:

error_reporting(-1);
3
jewelhuq

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

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

3
pardeep

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

2
Peter Haberkorn

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

display_errors = on
display_startup_errors = on

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

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);**strong text**
2
Muhammad Adeel Malik