Как я могу отслеживать неудачные включения файлов с помощью backtrace? - PullRequest
1 голос
/ 09 июля 2011

Просим приличных мыслей по этому поводу:

Я хотел бы реализовать некоторый механизм в коде PHP, который может запускать любой внешний код и вызывать функцию обратного вызова, если в нем произойдет сбой одного из включений (include, require + *_once).

Внешний код означает, что исполняемый код не написан мной и не контролирует его. Это включено для тестирования. Поэтому более детальная информация о сбоях включений более глубока.

Я сталкиваюсь с проблемой, что кажется невозможным иметь обратный вызов, когда происходит фатальная ошибка PHP.

Что я пробовал до сих пор:

  • Регистрация обработчика ошибок через set_error_handler - Не работает с фатальными ошибками.
  • Создан экземпляр объекта методом __destruct() - не вызывается с фатальными ошибками.
  • Зарегистрировано отключение - не вызывается при фатальных ошибках.

В любом из них я просто хотел получить debug_backtrace и затем поработать с предоставленной информацией.

Итак, вопрос вкратце: как отследить неудачные включения файлов из кода PHP и затем вызвать функцию.

Я боюсь, что ответ на этот вопрос - нет из моих недавних попыток и поисков, поэтому все проницательные высоко ценится. Даже если ваш ответ только усиливает «невозможную» точку.

Кроме того, полезно также выяснить, какой файл будет включен , поэтому создание вывода отладки до включения (сбой или нет) может быть выполнено, по крайней мере.

Примечания:

  • Предпочтительные без расширений. Однако, если что-то существует, я тоже хочу знать.
  • Внешний код означает, что исполняемый код не написан мной и не контролирует его. Это включено для тестирования. Поэтому более детальная информация о сбоях включений более глубока.

Связанный:

Ответы [ 2 ]

2 голосов
/ 09 июля 2011

Мои предложения не проверены, вот несколько вещей, которые можно попробовать:

Если необходимые / включенные файлы php являются классами , автозагрузка может быть опцией

function __autoload($class)
{
    // try to load
}

Если вы можете обернуть require / includes в блоке try catch, устанавливая обработчик ошибок для использования исключений может также работает: Обновление: не работает: (

function exception_error_handler($errno, $errstr, $errfile, $errline ) {
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
}
set_error_handler("exception_error_handler");

Если код, который нужно протестировать, можно проверить в командной строке с помощью popen и xdebug, то вы запустите программу в отдельном процессе, если pclose вернет -1, вы можете проанализировать обратную трассировку из xdebug.

    $cmd = 'php --php-ini path/php.ini file/to/run.php';
    $output = '';
    $popen  = popen($cmd, 'rb');

    while (!feof($popen)) {
        $output .= fread($popen, 4096);
    }

    if (pclose($popen) < 0) {
        // error - parse $output for xdebug backtrace
    }
0 голосов
/ 09 июля 2011

Тебе это не нужно.Для загрузки классов используйте функцию __autoload.Чтобы включить статические файлы, используйте require_once.Чтобы загрузить динамические файлы, вы должны проверить их перед использованием (file_exeists, is_readable и т. Д.) И выдать исключения, если файлы не найдены для возврата.

...