Устойчивые PHP включают для обработки ошибок?

Я вслепую не пропустил бы первые три байта; что, если производитель остановки добавление BOM снова? То, что необходимо сделать, , исследуют первые несколько байтов, и если они - 0xEF 0xBB 0xBF, игнорируют их. Это - форма, которую символ BOM (U+FEFF) принимает в UTF-8; я предпочитаю иметь дело с ним прежде, чем попытаться декодировать поток, потому что обработка BOM так непоследовательна от одного языка/инструмента/платформы до следующего.

На самом деле, это - то, как Вы , предположил иметь дело с BOM. Если файлом служили UTF-16, необходимо исследовать первые два байта, прежде чем Вы начнете декодировать так, Вы знаете, считать ли его как или прямой порядок байтов с обратным порядком байтов. Конечно, BOM UTF-8 не имеет никакого отношения к порядку байтов, он должен просто там сообщить, что кодирование является UTF-8, в случае, если Вы уже не знали это.

14
задан erjiang 6 October 2009 в 18:48
поделиться

6 ответов

Вы можете просто

@include "fileWithBadSyntax.php";

Что, согласно моим быстрым тестам, работает как для ошибок синтаксического анализа, так и для ошибок, выданных с помощью trigger_error ().

РЕДАКТИРОВАТЬ : Это совершенно неверно. См. Ответ подлости, он правильный, хотя и несколько бесполезный.

6
ответ дан 1 December 2019 в 06:08
поделиться

Можно ли изменить вашу архитектуру и превратить badfile.php в веб-службу? Вместо того, чтобы включать его непосредственно в свою кодовую базу, вы должны вызвать его по сети и проанализировать или включить его вывод. Это поможет вам избежать ошибок синтаксического анализа, вы также сможете избежать потенциально вредоносного кода, если у вас есть соответствующая ограниченная среда badfile.php (с использованием safe_mode или запуском отдельного процесса веб-сервера с ограниченными привилегиями).

2
ответ дан 1 December 2019 в 06:08
поделиться

В 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();
 }
-1
ответ дан 1 December 2019 в 06:08
поделиться

Вы можете выполнить блок 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

2
ответ дан 1 December 2019 в 06:08
поделиться

Ни один из этих ответов не сработает. Тот, получивший наибольшее количество голосов, который сообщает @include (), все равно завершит работу первого скрипта, если во включенном файле будет ошибка синтаксического анализа.

Вы не можете использовать eval (), вы не можете попробовать / поймать его, и любой способ вызова include или require завершит все выполнение в скрипте.

Этот вопрос остается ОТКРЫТЫМ и НЕРЕШЕННЫМ.

http://bugs.php.net/bug.php?id=41810

Это ошибка в PHP, и эта функция отсутствует по крайней мере с 2006 года. Они классифицировали ошибку как «фиктивную», потому что: они утверждают, что include () и requires () происходят во время компиляции.

Это выходит за пределы окна, если вы генерируете строковые аргументы для include () и / или require () в RUNTIME или выполняете eval () над строкой, содержащей код, который запускает include ().

36
ответ дан 1 December 2019 в 06:08
поделиться

Вот единственное реальное решение, которое мне удалось найти:

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. : /

-3
ответ дан 1 December 2019 в 06:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: