Предотвращение сбоев в написанных пользователем 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.

Другие вопросы по тегам