Я вслепую не пропустил бы первые три байта; что, если производитель остановки добавление BOM снова? То, что необходимо сделать, , исследуют первые несколько байтов, и если они - 0xEF 0xBB 0xBF, игнорируют их. Это - форма, которую символ BOM (U+FEFF) принимает в UTF-8; я предпочитаю иметь дело с ним прежде, чем попытаться декодировать поток, потому что обработка BOM так непоследовательна от одного языка/инструмента/платформы до следующего.
На самом деле, это - то, как Вы , предположил иметь дело с BOM. Если файлом служили UTF-16, необходимо исследовать первые два байта, прежде чем Вы начнете декодировать так, Вы знаете, считать ли его как или прямой порядок байтов с обратным порядком байтов. Конечно, BOM UTF-8 не имеет никакого отношения к порядку байтов, он должен просто там сообщить, что кодирование является UTF-8, в случае, если Вы уже не знали это.
Вы можете просто
@include "fileWithBadSyntax.php";
Что, согласно моим быстрым тестам, работает как для ошибок синтаксического анализа, так и для ошибок, выданных с помощью trigger_error ().
РЕДАКТИРОВАТЬ : Это совершенно неверно. См. Ответ подлости, он правильный, хотя и несколько бесполезный.
Можно ли изменить вашу архитектуру и превратить badfile.php в веб-службу? Вместо того, чтобы включать его непосредственно в свою кодовую базу, вы должны вызвать его по сети и проанализировать или включить его вывод. Это поможет вам избежать ошибок синтаксического анализа, вы также сможете избежать потенциально вредоносного кода, если у вас есть соответствующая ограниченная среда badfile.php (с использованием safe_mode или запуском отдельного процесса веб-сервера с ограниченными привилегиями).
В badfile.php вы можете заставить его возвращать значение:
<?php
//inestable instructions.
return true; ?>
, затем в основном файле вы можете сделать:
<?php
if (require($badFile)) {
//if it was true continue with normal execution
} else {
echo "Error: ". error_get_last();
}
Вы можете выполнить блок try / catch
<?php
try {
include("someFile.php");
} catch (Exception $e) {
// Should probably write it to a log file, but... for brevity's sake:
echo 'Caught exception: ', $e->getMessage(), "\n";
}
?>
Теперь он будет включать файл только в том случае, если ошибки нет. Если есть ошибка, он просто пропустит этот материал и запишет исключение (например, в комментарии, желательно в файл журнала или что-то в этом роде).
Для получения дополнительной информации: http://us2.php.net/manual/en/language.exceptions.php
Ни один из этих ответов не сработает. Тот, получивший наибольшее количество голосов, который сообщает @include (), все равно завершит работу первого скрипта, если во включенном файле будет ошибка синтаксического анализа.
Вы не можете использовать eval (), вы не можете попробовать / поймать его, и любой способ вызова include или require завершит все выполнение в скрипте.
Этот вопрос остается ОТКРЫТЫМ и НЕРЕШЕННЫМ.
http://bugs.php.net/bug.php?id=41810
Это ошибка в PHP, и эта функция отсутствует по крайней мере с 2006 года. Они классифицировали ошибку как «фиктивную», потому что: они утверждают, что include () и requires () происходят во время компиляции.
Это выходит за пределы окна, если вы генерируете строковые аргументы для include () и / или require () в RUNTIME или выполняете eval () над строкой, содержащей код, который запускает include ().
Вот единственное реальное решение, которое мне удалось найти:
function safe_include($fn) {
$fc = file_get_contents($fn);
if(!eval($fc)) {
return 0;
}
return 1;
}
Обратите внимание, что приведенный выше код означает, что вы должны удалить открывающие операторы из файлов, которые должны быть включены, или выполните следующие действия:
eval("?>" . $fc)
Проблема в том, что вы не можете в любой момент вызвать require () или include () или их варианты _once () и ожидать, что они не завершат все , включая любые обработчики ошибок. PHP полностью перестанет обрабатывать все, когда обнаружит ошибку синтаксического анализа.
Единственное исключение - это строка внутри eval (). Однако проблема в том, что вы не можете этого сделать:
eval('require($fn);');
... потому что require () внутри строки eval'd по-прежнему остановится. Вы должны прочитать содержимое, молиться, чтобы рассматриваемый файл не включал () или require () дальше, и eval () это.
Настоящее решение? Пропустите PHP. : /