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



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



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



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


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

757   24  

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.Ини, вы можете быть в состоянии использовать .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 в .htaccess.

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

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-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.";
}

Если, несмотря на все вышеперечисленные ответы (или вы не можете редактировать свой php.ini file), вы все еще не можете получить сообщение об ошибке, попробуйте создать новый файл PHP, который позволяет создавать отчеты об ошибках, а затем включить файл проблемы. например:

error_reporting(E_ALL);
ini_set('display_errors', 1);
require_once('problem_file.php');

несмотря на то, что все установлено правильно в моем php.ini file, это был единственный способ, которым я мог поймать ошибку пространства имен. Мой точный сценарий был:

//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 куска кода:

File: tst1.php

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

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

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

File: 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().

Comments

    Ничего не найдено.