Предотвращение сбоев в написанных пользователем include ()
Рассмотрим следующий код:
try {
include_once "malformedFile.php";
} catch(Exception $e) {
return null;
}
У меня нет никакого способа убедиться, что файл malformedFile.php является допустимым кодом PHP, не потерпит крах или не вызовет die(). Как я могу продолжить поймать, даже если malformedFile.php умирает или падает? Я заинтересован в том, чтобы сделать приложение максимально надежным, но при этом позволить пользователям реализовывать свои собственные плагины с помощью включений.
Благодарю.
2 ответа
К сожалению, вы не можете. Если включенный код вызывает фатальную ошибку (например, неправильный синтаксис), вы мертвы в воде.
Вы можете попробовать загрузить файл вручную, а затем вызвать eval
:
$code = file_get_contents("malformedFile.php");
eval($code);
Конечно, это то, что вы должны подумать трижды, прежде чем делать, потому что, как мы все знаем, eval
зло и т. д.
Самый надежный вариант - создать другой процесс, который include
для вас (так что если он неожиданно умирает, ничего страшного), но общение между родительским и дочерним процессами будет гораздо сложнее, чем просто иметь один процесс.
Include
будет включать источник, никак не обойтись.
Может быть, вы можете вызвать этот файл как внешний процесс и просто использовать результаты. Это можно сделать как скрипт CLI или с помощью отдельного вызова CURL.