(Hypertext Preprocessor)

PHP 7.x не выводит ошибки в браузер

Александр » 05 май 2019, 01:55

Решил тут на днях небольшой скрипт написать на PHP. В качестве локального сервера на Windows 10 я использую OSPanel.
Конфигурация такова: Apache 2.4 с модулем php7apache2_4.dll
В php.ini вроде бы всё включено для вывода ошибок и предупреждений:
Код: Выделить всё
error_reporting = E_ALL
display_errors = On
display_startup_errors = On
log_errors = On

log_errors_max_len = 1024
ignore_repeated_errors = Off
ignore_repeated_source = Off
report_memleaks = Off
;report_zend_debug = 0
track_errors = On
;xmlrpc_errors = 0
;xmlrpc_error_number = 0
html_errors = On
;docref_root = "/phpmanual/"
;docref_ext = .html
;error_prepend_string = "<span style='color: #ff0000'>"
;error_append_string = "</span>"
error_log = "%sprogdir%/userdata/logs/%phpdriver%_error.log"
;windows.show_crt_warning

На виртуальном хосте test файла .htaccess нет.
Вывод функции phpinfo:
Не отображаются ошибки PHP 7.x, вывод phpinfo

Запускаю простейший скрипт с инструкцией включения несуществующего файла f.php.
Код: Выделить всё
<?php
include 'f.php';
?>

И вижу только пустую страницу в браузере, и error.log не создаётся.
Но стоит добавить в начало файла директиву error_reporting(E_ALL);
Код: Выделить всё
<?php
error_reporting(E_ALL);
include 'f.php';
?>

Как появляется ожидаемый Warning
Warning: include(f.php): failed to open stream: No such file or directory in S:\domains\test\clear-cache.php on line 7

Warning: include(): Failed opening 'f.php' for inclusion (include_path='.;s:/modules/php/PHP-7.1-x64;s:/modules/php/PHP-7.1-x64/PEAR/pear') in S:\domains\test\clear-cache.php on line 7

И в error.log всё это пишется.

Эта проблема наблюдается в PHP 7.0, PHP 7.1. В PHP 5.5, В PHP 5.6 с такой же конфигурацией в php.ini ошибки выводятся в браузер.

Поиски по интернету ответа толком не давали, только везде вариации указания в начале скрипта строк типа :
Код: Выделить всё
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

Мне же оказалось достаточно написать только
Код: Выделить всё
error_reporting(E_ALL);

А вот
Код: Выделить всё
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
ничего не давали.

Не понятно, как это работает.
Закрались мысли, что что-то поменялось в ядре PHP 7.x, то ли у меня в системе какой-то комплексный баг.
Что-то на этапе парсинга или интерпретации скрипта происходит.. Но что?
Позже натокнулся на сайте php.net/manual/en/language.errors.php7.php на упоминание, что в PHP 7.0 поменялась методика обработки ошибок:
PHP 7 changes how most errors are reported by PHP. Instead of reporting errors through the traditional error reporting mechanism used by PHP 5, most errors are now reported by throwing Error exceptions.

As with normal exceptions, these Error exceptions will bubble up until they reach the first matching catch block. If there are no matching blocks, then any default exception handler installed with set_exception_handler() will be called, and if there is no default exception handler, then the exception will be converted to a fatal error and will be handled like a traditional error.

Что-то в рунете про это не встретил информации.
В общем буду пробовать разобраться.
Александр
 
Сообщения: 303
Зарегистрирован: 20 мар 2014, 17:05

Вернуться в PHP