Я переместил файл в нашей системе в подпапку для организации, что, в свою очередь, нарушило относительный путь оператора require
. Это должно было привести к предупреждению E_COMPILE_ERROR
. Однако вместо этой ошибки наш пользовательский обработчик ошибок в приложении распознал ошибку как E_WARNING
. Таким образом, наш клиентский обработчик зарегистрировал сообщение, и полученный экран PHP оказался пустым, как если бы был запущен die();
. Вот журнал, созданный нашим локальным обработчиком:
E_WARNING main(XXXXXX.php): failed to open stream: No such file or directory xxx/xxx.php Line 9 01-26-2012 09:44:27 AM 01-26-2012 10:03:24 AM
Может быть важно отметить, что наша система все еще использует устаревшую PHP 4
.
Любая идея, зачем требовать, чтобы бросал E_WARNING? Чтобы выяснить причину проблемы, потребовалось немного больше времени, поскольку мы не увидели ни одного сообщения об ошибке.
Редактировать: приложение определенно выполняло требование. Пользовательский обработчик ошибок просто использует PHP-функцию set_error_handler. Поэтому его нельзя вызывать ни для чего, кроме предупреждений, уведомлений и ошибок пользователя.
Дополнительные правки:
Может быть, структура как-то связана с этим? Вот как это работает:
(-> означает включает, => означает требует)
Main-> File1.php => File2.php
Выдает ли предупреждение, потому что File1.php включен, но не обязателен? Это может иметь смысл для меня, но может показаться глюк? Мне может понадобиться проверить это на PHP 5.
РАЗРЕШЕНИЕ
Я просканировал наше приложение и нашел это:
сообщение об ошибке (E_ERROR | E_WARNING | E_PARSE);
Следовательно, E_COMPILE_ERROR не будет отображаться. Кроме того, @DaveRandom прав, когда выдает предупреждение, а затем выдает фатальную ошибку.
Изменение его на
сообщение об ошибке (E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
показывает сообщение об ошибке.