Как поймать ошибку require () или include () в PHP?
Я пишу скрипт в PHP5, который требует кода определенных файлов. Когда файл недоступен для включения, сначала выдается предупреждение и затем происходит фатальная ошибка. Я хотел бы напечатать собственное сообщение об ошибке, когда было невозможно включить код. Можно ли выполнить одну последнюю команду, если запрос не работает? следующее не сработало:
require('fileERROR.php5') or die("Unable to load configuration file.");
Подавление всех сообщений об ошибках с использованием error_reporting(0) дает только белый экран, не используя error_reporting, дает PHP-ошибки, которые я не хочу показывать.
Вы можете выполнить это, используя set_error_handler в сочетании с ErrorException .
Пример страницы ErrorException :
set_error_handler("exception_error_handler"); /* Trigger exception */ strpos(); ?>
Когда вы будете обрабатывать ошибки как исключения, вы можете сделать что-то вроде:
Я просто использую ‘file_exists ()’:
if (file_exists("must_have.php")) < require "must_have.php"; >else
Лучшим подходом было бы сначала использовать путь realpath на пути. realpath вернет false если файл не существует.
$filename = realpath(getcwd() . "/fileERROR.php5"); $filename && return require($filename); trigger_error("Could not find file ", E_USER_ERROR);
Вы даже можете создать свою собственную функцию require в пространстве имен вашего приложения, которое обертывает требуемую функцию PHP
namespace app; function require_safe($filename) < $path = realpath(getcwd() . $filename); $path && return require($path); trigger_error("Could not find file ", E_USER_ERROR); >
Теперь вы можете использовать его в любом месте в ваших файлах
namespace app; require_safe("fileERROR.php5");
Я бы посоветовал вам взглянуть на последний комментарий в документации для функции set_error_handler () .
Он предлагает следующее как метод (и пример) улавливания фатальных ошибок:
register_shutdown_function('shutdown'); ini_set('max_execution_time',1 ); sleep(3); ?>
Я не пробовал это предложение, но это можно было бы использовать в других фатальных сценариях ошибок.
Вам нужно использовать include (). Требовать (), когда он используется в несуществующем файле, приводит к фатальной ошибке и выходит из сценария, поэтому ваш die () не произойдет. Include () только предупреждает, а затем продолжает скрипт.
Как отловить ошибку require () или include () в PHP?
Я пишу script в PHP5, для которого требуется код определенных файлов. Когда файл недоступен для включения, сначала выдается предупреждение, а затем фатальная ошибка. Я хотел бы напечатать собственное сообщение об ошибке, когда было невозможно включить код. Можно ли выполнить одну последнюю команду, если запрос не работает? следующее не получилось:
require('fileERROR.php5') or die("Unable to load configuration file.");
Подавление всех сообщений об ошибках с помощью error_reporting(0) дает только белый экран, не используя error_reporting, дает PHP-ошибки, которые я не хочу показывать.
5 ответов
Вы можете выполнить это, используя set_error_handler в сочетании с ErrorException . Пример страницы ErrorException :
set_error_handler("exception_error_handler"); /* Trigger exception */ strpos(); ?>
Приведенный выше пример скопирован непосредственно из документации ErrorException (ссылка выше) — в «официальном» примере они используют $ errno как $ code, в то время как другие (в том числе в комментариях на этой странице) предложили использовать его как $ severity — обратите внимание, что если вам нравится, вы можете использовать его для обоих, или ни для одного.
Я просто использую ‘file_exists()’:
if (file_exists("must_have.php")) < require "must_have.php"; >else
Лучше использовать is_readable () ; он проверяет наличие файла, в дополнение к читаемости файла (просто, файл должен существовать, чтобы быть читаемым). Также, чтобы не включать каталоги, вы должны использовать is_dir () (то есть! Is_dir ($ filename)).
Лучшим подходом было бы использовать realpath на пути в первую очередь. realpath вернет false , если файл не существует.
$filename = realpath(getcwd() . "/fileERROR.php5"); $filename && return require($filename); trigger_error("Could not find file ", E_USER_ERROR);
Вы даже можете создать свою собственную функцию require в своем приложении namespace, для которой требуется функция PHP
namespace app; function require_safe($filename) < $path = realpath(getcwd() . $filename); $path && return require($path); trigger_error("Could not find file ", E_USER_ERROR); >
Теперь вы можете использовать его в любом месте в своих файлах
namespace app; require_safe("fileERROR.php5");
Я абсолютно не знаю, почему, но ваш код не работает правильно (выдает ложное срабатывание) при запуске в PHP CLI / console. Т.е. он останавливает выполнение скрипта, утверждая, что файл XYZ не существует, в то время как он действительно существует — комментирование вашего кода и прямой переход к include() работает нормально, и файл включается без ошибок.
Я бы посоветовал вам взглянуть на недавний комментарий в документации для set_error_handler().
Он предлагает следующее как метод (и пример) улавливания фатальных ошибок:
register_shutdown_function('shutdown'); ini_set('max_execution_time',1 ); sleep(3); ?>
Я не пробовал это предложение, но это можно было бы использовать в других фатальных сценариях ошибок.
Хотя это может сработать, но возникает хороший вопрос, будет ли это работать в условиях, которые задает ОП? Я полагаю, что большинство людей, приземляющихся здесь, ищут решение, где они могут поймать require на несуществующий файл и продолжить выполнение скрипта. Возможность изящно умереть (то есть отобразить что-то, я хочу, но в конечном итоге завершить работу скрипта — и именно это, похоже, и делает ваш код), кажется, не вписывается во многие сценарии. Я предполагаю, что скрипт может отображать все, что захочет, если умрет. Я хочу предотвратить смерть / завершение для несуществующего файла, который require по require .
Вам нужно использовать include(). Require() при использовании в несуществующем файле производит фатальную ошибку и выходит из script, поэтому ваш die() не будет выполняться. Include() только предупреждает, а затем продолжает script.
Ваш ответ относится либо к определенной версии PHP, либо к определенной конфигурации php.ini . С моей стороны (PHP 5.5.4) с моей конфигурацией изменение, require include не имеет абсолютно никакой разницы. Оба бросают ужасные фатальные ошибки, которые я не могу поймать.