Как мне получить ошибки PHP?

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

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

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

Что нужно делать?

1379
задан Abs 27 июня '09 в 22:09
источник поделиться
24 ответов

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

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

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

display_errors = on
2668
ответ дан Fancy John 29 янв. '14 в 14:25
источник поделиться

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

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

135
ответ дан Michael Madsen 27 июня '09 в 22:14
источник поделиться

Внутри php.ini:

display_errors = on

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

122
ответ дан user1803477 08 янв. '13 в 12:27
источник поделиться

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

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
81
ответ дан andre 29 янв. '14 в 12:52
источник поделиться

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

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

php_value display_errors 1

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

40
ответ дан Kalhua 18 мая '13 в 18:01
источник поделиться

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

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

<?php
     error_reporting(E_ALL);
     ini_set('display_errors', 1);    
?>
26
ответ дан Mahendra Jella 05 мая '14 в 16:23
источник поделиться

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

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

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

php -l phpfilename.php
25
ответ дан Abhijit Jagtap 04 мая '16 в 22:14
источник поделиться

Установите это в index.php

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
16
ответ дан Sumit Gupta 26 сент. '17 в 15:32
источник поделиться

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

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

display_errors = on

display_startup_errors = on
15
ответ дан NavyaKumar 31 марта '15 в 21:38
источник поделиться

Вот сценарий 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().

12
ответ дан B.Balamanigandan 11 янв. '16 в 15:37
источник поделиться

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

10
ответ дан mike 28 янв. '14 в 18:41
источник поделиться

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

Если, несмотря на все приведенные выше ответы (или вы не можете отредактировать файл 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 not sure which 'x' class to use
class x {
    ...
}
9
ответ дан jxmallett 24 апр. '15 в 5:55
источник поделиться

Поскольку мы теперь запускаем PHP7, ответы, приведенные здесь, не верны. Единственный, все еще в порядке, тот, что у Фрэнка Форте, поскольку он говорит о PHP7. С другой стороны, вместо того, чтобы пытаться поймать ошибку с помощью try/catch, вы можете использовать трюк: use 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 в строке 4

8
ответ дан Peter 20 мая '17 в 15:07
источник поделиться

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

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

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

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

8
ответ дан Binit Ghetiya 01 февр. '17 в 10:33
источник поделиться

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

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

7
ответ дан Channaveer Hakari 01 февр. '17 в 10:16
источник поделиться

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

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");
5
ответ дан lintabá 04 июня '17 в 17:41
источник поделиться

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

try {

//Page code

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

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

3
ответ дан Xakiru 27 марта '17 в 5:31
источник поделиться

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

Однако попытайтесь отредактировать код на телефоне в файле

error_reporting = on

2
ответ дан Wembo Mulumba 09 мая '17 в 6:28
источник поделиться

Просто напишите:

error_reporting(-1);
1
ответ дан jewelhuq 13 янв. '17 в 21:56
источник поделиться
<?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 можно включить для устранения неполадок.

1
ответ дан pardeep 24 мая '18 в 11:48
источник поделиться

То, что я узнал. В файле PHP.INI

error_reporting = E_ALL
display_errors = On
1
ответ дан Salam 27 апр. '17 в 19:29
источник поделиться

Если у вас установлен 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. Эта битовая маска будет логически ORed с битовой маской, представленной error_reporting, на dermine, где должны отображаться ошибки. Этот параметр можно сделать только в php.ini и позволяет принудительно отображать определенные ошибки независимо от того, что делает приложение с помощью ini_set().

0
ответ дан Peter Haberkorn 19 окт. '17 в 8:45
источник поделиться

Другие вопросы по метке или Задайте вопрос