Як отримати відображення помилок PHP?


1731

Я перевірив свій PHP-файл ini ( php.ini) і display_errorsвстановлений, а також повідомляється про помилкиE_ALL . Я перезапустив свій веб-сервер Apache.

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

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

Що залишається зробити?


8
Я ще не зрозумів, чому саме це працює іноді, а не інші, але для тих, хто хоче швидко перемикати помилки в скрипті php (або вмикати їх за допомогою $_REQUESTпараметра), ці два рядки працюватимуть більшу частину часу.
брендоскрипт

добре ви можете побачити деталі помилки, включивши xdebug з PHP-файлу ini.
Jewhuq

Ось коротка стаття, яка висвітлює тему - blog.phplogger.com/2019/03/10/error-message-visibility-in-php
Bogdans

Відповіді:


3200

Це завжди працює для мене:

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

9
Також зауважте, що ви можете використовувати ці 3 рядки, а потім включити ('fileImWorkingOn.php') ;. Тоді ви також можете вловлювати синтаксичні помилки!
Оснащення

14
Поки я не SysOps, я думаю, що більшість людей мають файл .htaccess, ніж php.ini, і вони би прийшли до розбору, правда? php_flag display_errors 1для .htaccess
Райан Тейлор

1
Отже, тепер, коли помилки реєструються, куди вони йдуть? Я перейшов до / var / log / apache2, і він показує всі журнали, але інформації про програму, яку я нещодавно запускав, немає. Інформацію про перезавантаження системи я отримую лише один раз вранці.
Майкл

1
@Michael Помилки йдуть прямо на екран або туди, куди перенаправлено вихід
Fancy John

2
E_ALLнедостатньо для відображення всіх помилок у PHP 5.3. " E_STRICTстав частиною E_ALL5.4.0" - Посібник PHP Вам потрібен E_ALL | E_STRICTабо -1в цій версії.
Джерард Рош

155

Ви не можете зафіксувати помилки розбору при включенні виводу помилок під час виконання, оскільки він аналізує файл перед тим, як насправді нічого не виконати (а оскільки під час цього виникає помилка, він нічого не виконує). Вам знадобиться змінити фактичну конфігурацію сервера, щоб увімкнено помилки display_errors та використовувати відповідний рівень помилки_репортажу. Якщо у вас немає доступу до php.ini, ви, можливо, зможете використовувати .htaccess або подібне, залежно від сервера.

Це запитання може надати додаткову інформацію.


2
Не знав цього. Я редагував файл php.ini вручну, і він працює зараз. Дякую!
Abs

143

Всередині вашого php.ini :

display_errors = on

Потім перезавантажте веб-сервер.


7
+ ①. У моєму ubuntu /etc/php5/apache2/php.ini
m93a

5
для перезапуску (Debian, Ubuntu тощо)sudo service apache2 restart
Пітер Краусс

4
Для перезавантаження на OS X sudo apachectl -k restart.
Горох

3
цікавий факт: ви можете знайти завантажений файл php.ini, якщо ви просто помістите phpinfo (); у порожній php-файл. це 7-й ряд вниз і називаєтьсяLoaded Configuration File
Frankenmint

Як ми можемо це зробити, якщо записуємо php-код direclty на cPanel?
arqam

98

Щоб відобразити всі помилки, потрібно:

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

51

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

Ви можете додати наступний рядок:

php_value display_errors 1

У мене було те саме питання, що і у вас, і це рішення вирішило його.


А якщо ви перебуваєте в середовищі nginx, тоді додайте значення php до конфігурації свого веб-сайту (доступні сайти) відповідно до директиви location \ \ .php. fastcgi_param PHP_VALUE "error_reporting = E_ALL; \ n display_errors = 1;";
Лазарос Космідіс

40

Можливо, ви знайдете, що всі параметри для "повідомлення про помилки" або "помилки на дисплеї", як видається, не працюють у 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'];
}

1
Ви маєте на увазі PHP7 або PHP7.1? Я розгублений, я постарався, як запропонована валідована відповідь, і це працює, я думаю, ви пропонуєте щось трохи інше IMHO, дійсно "відсутність зворотної сумісності", і якщо вам доведеться змінити повний код PHP <7 і потрібно додавати try{} catch() {}код скрізь у вашому вже визначеному php-коді я навіть не хочу думати, що це буде безлад ..
vdegenne

@FancyJohn, це може допомогти: $bt = debug_backtrace(); print_r($bt);.
Френк Форте

@ballangddang, я зіткнувся з проблемою з PHP 7.0, де єдиним способом я міг отримати помилку для відображення, використовуючи блоки try / catch та спеціально лову Error. Якщо ви перезаписуєте всі запити (крім, можливо, JavaScript, CSS, зображень тощо) у файл index.php, тоді в ньому є блок пробування, це полегшує. Так, будь-яка система, яка не має єдиної точки входу, була б головним болем для оновлення.
Френк Форте

Чи PHP не показує необроблених винятків? Досить впевнений, що це робить?
Мартін Турнойдж

Він повинен показувати необроблені винятки. Якщо ви включите вихідний буфер на початку (щоб ви могли надсилати заголовки в будь-яку точку, перш ніж остаточно змити тіло відповіді), можливо, повідомлення про виключення може десь загубитися.
Френк Форте


33

Використання:

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

Це найкращий спосіб записати його, але синтаксична помилка дає порожній вихід, тому використовуйте консоль, щоб перевірити наявність синтаксичних помилок. Найкращий спосіб налагодження PHP-коду - це використання консолі; запустіть наступне:

php -l phpfilename.php

22

Встановіть це у файлі index.php :

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

20

Створіть файл під назвою php.ini в папці, де знаходиться ваш PHP-файл.

Всередині php.ini додайте наступний код (я даю просту помилку, що показує код):

display_errors = on

display_startup_errors = on

18

Ось сценарій 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 () .


2
Як це не відрізняється від Fancy Джона відповіді ?
Усі працівники найважливіші

@cpburnz - це прямі запитання вперед, кожен з них має однаковий набір кодів за своїм смаком, що єдина різниця. Я надав додаткове посилання на URL, яке дасть більше інформації про помилку PHP.
B.Balamanigandan

15

Якщо, незважаючи на всі наведені вище відповіді (або ви не можете редагувати файл 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 {
    ...
}

1
Ні, повідомлення про помилки - це не лонген, а бітове поле. Використання 999999 - дуже погана ідея, використовуйте енергію двох мінус 1, наприклад 2047!
петерх

Ви абсолютно праві, @peterh! Я змінив його на E_ALL, оскільки це дозволить повідомляти про всі помилки (крім суворих помилок у php 5.4 та нижче).
jxmallett

15

Зазвичай у моїх простих проектах 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.');
    }
}

15

Використовуючи 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


Ланка розірвана (404).
Пітер Мортенсен

14

Якщо ви якимось чином опинитесь у ситуації, коли ви не можете змінити налаштування через 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.";
}

find . -name '*.php' -type f -exec php -l {} \; | grep -v 'No syntax errors detected'простіше
scones

14

Оскільки зараз у нас працює PHP 7, відповіді, наведені тут, більше не є правильними. Єдиний з них все одно ОК - це Френк Форте , коли він говорить про PHP 7.

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

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

Файл: 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


13

Ви можете зробити щось подібне нижче:

Встановіть нижче параметри у своєму головному файлі індексу:

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

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


Що таке "основний індексний файл" ? Файл index.html?
Пітер Мортенсен

12

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

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

7

Цей код зверху повинен працювати:

error_reporting(E_ALL);

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

error_reporting =on

6

Найкраще / легке / швидке рішення, яке ви можете використовувати, якщо це швидка налагодження, - оточити ваш код вилученням винятків. Це я роблю, коли хочу перевірити щось швидке у виробництві.

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

Для php7, catch (Throwable $e)краще ... Або ще один блок лову під нимcatch(Error $e)
Франк Форте


4

Це я дізнався. У файлі PHP.INI

error_reporting = E_ALL
display_errors = On

2
Зміна? Додавання до?
Пітер Мортенсен

atm ваша відповідь не має сенсу, оскільки її відсутність; також передбачено Пітером Мортенсеном. Не покращуючи це, він готує його до "прапор для видалення" (ботами). (З огляду низької якості).
ZF007

4
    <?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.


4

Це можна зробити, змінивши файл php.ini і додавши наступне

display_errors = on
display_startup_errors = on

АБО ви також можете використовувати наступний код, оскільки це завжди працює для мене

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

3

Якщо у вас встановлений Xdebug, ви можете змінити всі параметри, встановивши:

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

force_display_errors

Тип: int, значення за замовчуванням: 0, введене в Xdebug> = 2.3 Якщо для цього параметра встановлено значення 1, то завжди відображатимуться помилки, незалежно від того, які параметри відображуються помилок PHP в PHP.

force_error_reporting

Тип: int, значення за замовчуванням: 0, введено в Xdebug> = 2.3 Цей параметр є бітовою маскою, як помилка_репортаж. Ця бітмаска буде логічно ORI з бітовою маскою, представленою error_reporting, щоб визначити, які помилки повинні відображатися. Цей параметр може бути зроблений лише у php.ini та дозволяє змусити відображати певні помилки незалежно від того, що робить програма з ini_set ().


3

Ви можете скористатися цим кодом:

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

2

Повідомте про всі помилки, крім E_NOTICE

error_reporting(E_ALL & ~E_NOTICE);

Показати всі помилки PHP

error_reporting(E_ALL);  or ini_set('error_reporting', E_ALL);

Вимкніть усі повідомлення про помилки

error_reporting(0);

1

У Unix CLI дуже практично перенаправляти лише помилки на файл :

./script 2> errors.log

Потім з іншої оболонки, для живих змін:

tail -f errors.log

або просто

watch cat errors.log

Як це відповідає на це питання щодо PHP?
Пітер Мортенсен

./scriptце скрипт php CLI (хешбанг #!/usr/bin/php). Ви можете перенаправити помилки php у файл таким чином. Це трубопроводи Unix. Це не php як CGI.
NVRM

0

Якщо в командному рядку, ви можете запустити phpз -ddisplay_errors=1перевизначити налаштування в php.ini:

php -ddisplay_errors=1 script.php

-1

За винятком функцій php.iniта ini_set()функцій у PHP-скрипті, ви можете виконати те ж саме за допомогою .htaccessтаhttpd.conf директиви, показані нижче.

Деякі хостинг-провайдери дозволяють встановити настройки PHP через .htaccessіhttpd.conf .

Сховати помилки PHP

php_flag display_startup_errors ON

php_flag display_errors ON

php_flag html_errors ON

php_flag log_errors on

php_flag ignore_repeated_errors off

php_flag ignore_repeated_source off

php_flag report_memleaks on

php_flag track_errors on

php_value docref_root 0

php_value docref_ext 0

php_value error_log /home/path/public_html/domain/PHP_errors.log

php_value error_reporting 999999999

php_value error_reporting -1

php_value log_errors_max_len 0

Order allow,deny

Deny from all

Satisfy All

знайшов цю відповідь, гугливши трохи

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.