Почему PHP не сообщает об этой ошибке?
Сервер работает под управлением PHP5.3. Я нашел проблему, комментируя код до запуска страницы. Когда я впервые загрузил страницу, я не получил вывод без ошибок.
Я установил сообщение об ошибке:
error_reporting(E_ALL^E_NOTICE);
ini_set('display_errors', 1);
Примечание. Уведомления необходимо отключить, поскольку система старая и изначально плохо написана (то, что мы сейчас решаем постепенно)
Строка, которая остановила выполнение скрипта без ошибок, была следующей.
<?php echo explode('cms/', pageURL())[0]?>
Это прекрасно работает в PHP5.4. Хорошо, что 5.3 не поддерживает это, но почему не отображается сообщение об ошибке? Что в этом такого, что делает его таким трудным для отладки? Это случалось один или два раза для различных проблем, и было бы хорошо лучше понять основную проблему.
Можно ли получить ошибки, чтобы показать на 5.3 с этой проблемой?
Отчет об ошибках работает на сервере.
poop();
Возвращает
Fatal error: Call to undefined function poop()
РЕДАКТИРОВАТЬ: при обновлении кода произошла ошибка при редактировании и была строка, которая содержала это:
$parts = echo explode('cms/',pageURL());
Это вызвало ту же проблему. Нет вывода, нет ошибок. Сценарий просто не работает.
5 ответов
Справочная информация:
Если твой error_reporting
настройки устанавливаются с помощью вызова функции (не файлов настроек), синтаксическая ошибка возникает в первом загружаемом файле (например: index.php
) интерпретатор PHP не может вывести ошибку.
Если у вас очень простой index.php
файл, который содержит файл с фатальной синтаксической ошибкой в нем, тогда интерпретатор PHP сможет вывести ошибку.
Это "известное ограничение" интерпретатора PHP, вызванное тем, что большинству интерпретаторов необходимо прочитать файл за два прохода, сначала чтобы подобрать токены, а затем оценить, правильно ли токены представляют грамматику языка (допустимый порядок токенов).,
Фактически выполнение кода происходит после того, как интерпретатор успешно завершает эти два прохода; если это не так, вся информация, которую имеет интерпретатор, состоит в том, что произошла синтаксическая ошибка, он не знает, что вы установили error_reporting
до некоторого уровня или другого, потому что он считает все, что он прочитал из файла, "недопустимым синтаксисом", поэтому он не может его запустить.
Конкретная информация:
Поскольку вы используете новую синтаксическую языковую конструкцию, которую предоставляет PHP 5.4, а PHP 5.3 нет, то допустимая конструкция PHP 5.4 становится синтаксической ошибкой в PHP 5.3.
Имея звонок в error_reporting
в том же файле, что и синтаксическая ошибка, означает, что вызов функции не произойдет, и уровень ошибки будет установлен неправильно.
Временное решение:
Установите уровень ошибок, объявив его в своем php.ini
файл или .htaccess
файл.
Ошибки разбора возникают перед анализом файла
Со следующим кодом:
<?php
error_reporting(E_ALL^E_NOTICE);
ini_set('display_errors', 1);
echo explode('cms/', pageURL())[0]
Код должен быть проанализирован перед обработкой содержимого. При запуске с ошибками отображения по умолчанию вы увидите:
Ошибка разбора: синтаксическая ошибка, неожиданный '[', ожидающий ',' или ';' в index.php в строке 4
Или похожие. Если есть ошибка синтаксического анализа - ни один файл не анализируется вообще, ошибка обрабатывается перед любым содержимым файла (которое никогда не обрабатывается, так как это фатальная ошибка), и, следовательно, параметры отчета об ошибках, предшествовавшие файлу, были загружено то, что относится.
В отличие от этого, это покажет сообщение об ошибке:
<?php
error_reporting(E_ALL^E_NOTICE);
ini_set('display_errors', 1);
require 'has_fatal_error.php';
<?php
// has_fatal_error.php;
echo explode('cms/', pageURL())[0]
Я не уверен в этом, но возможно, что этот конкретный тип ошибки подпадает под E_STRICT
, В PHP 5.4 E_STRICT
входит в E_ALL
, но в 5.3 этого не было.
Независимо от того, исправит это или нет, было бы разумно изменить ваше сообщение об ошибке на
error_reporting(E_ALL ^ E_NOTICE | E_STRICT);
Если первый файл, загруженный apache, содержит ошибку разбора, код никогда не запускается.
Вам нужно установить в INI-файл short_open_tag = On
после этого вы получите ошибку