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

В PHP я хочу прочитать файл в переменной и обрабатывать PHP в файле одновременно без использования буферизации вывода. Возможно ли это?

По сути, я хочу, чтобы это удалось, без использования ob_start():

<?php
ob_start();
include 'myfile.php';
$xhtml = ob_get_clean();
?>

Возможно ли это в PHP?

Обновление: я хочу сделать некоторые более сложные вещи в обратном вызове вывода (где буферизация вывода недопустима).

Ответ 1

Немного известная функция PHP позволяет обрабатывать включенный/требуемый файл как вызов функции с возвращаемым значением.

Например:

// myinclude.php
$value = 'foo';
$otherValue = 'bar';
return $value . $otherValue;


// index.php
$output = include './myinclude.php';
echo $output;
// Will echo foobar

Ответ 2

Из того, что я могу сказать в документации PHP, нет. Почему вы хотите избежать буферизации вывода?

Единственный способ обойти это - это хакерские методы, связанные с вызовом клиентской команды php client или выполнением запроса на завивание на основе того, что доступно и каковы конкретные требования.

Ответ 3

Прочитав все предложения, прочитав кучу документации и поиграв с некоторыми вещами, я придумал следующее:

<?php
$file = file_get_contents('/path/to/file.php');
$xhtml = eval("?>$file");
?>

Он как можно ближе, но, к сожалению, он не работает. Ключом к этому является включение закрывающего PHP-бит (?>) перед содержимым файла. Это выведет eval() из режима оценки PHP и обработает содержимое файла, начиная с кода, отличного от PHP. Затем, если в файле есть блоки кода PHP, они будут оцениваться как PHP. Облом в том, что он не сохраняет содержимое eval'd в переменной, он просто выводит его на страницу.

Спасибо за помощь всем!

Ответ 4

Джори Себрехтс прав. Альтернативный и немного более простой метод доступен, если PHP script доступен HTTP:

$data = file_get_contents('http://google.com/');

Следует отметить, что использование буферизации вывода было бы проще в ресурсах.

Ответ 5

Сделайте запрос curl на php-страницу, по сути дела делая вид, что он браузер.

Ответ 6

Что вы можете сделать, если файл является локальным, загружает script в переменную в виде строки, а затем запускает eval в строке. Затем вы можете делать все остальное. В противном случае вы должны использовать буферизацию вывода.

Ответ 7

$fileData = file_get_contents('fileOnDisk.php');
$results = eval($fileData);

Но проверьте документацию на eval, потому что на самом деле вам нужно, чтобы файл, который вы вызываете, возвращал свои результаты, а не просто эхо их:

http://us2.php.net/eval

Ответ 8

Осторожно! Вы можете сами провести оценку PHP с небольшим количеством хакеров, используя preg_replace_callback для поиска и замены блоков PHP.

function evalCallback($matches)
{
    // [0] = <?php return returnOrEcho("hi1");?>
    // [1] = <?php
    // [2] = return returnOrEcho("hi1");
    // [3] = ?>
    return eval($matches[2]);
}

function evalPhp($file)
{
    // Load contents
    $contents = file_get_contents($file);
    // Add returns
    $content_with_returns = str_replace(
                               "returnOrEcho"
                              ,"return returnOrEcho"
                              ,$contents);
    // eval
    $modified_content = preg_replace_callback(
                              array("|(\<\?php)(.*)(\?\>)|"
                             ,"evalCallback"
                             ,$content_with_returns);
    return $modified_content;
}

Вам нужно будет изменить файл PHP, который вы используете, чтобы использовать функцию returnOrEcho, чтобы она могла быть перегружена для этого случая и обычного случая. В этом случае вы хотите return, чтобы он был подхвачен eval так, как вы хотите, но нормальный случай - echo без возврата.

Итак, для этого случая вы бы определили:

function returnOrEcho($str)
{
    return $str;
}

и для нормального случая вы определяете:

function returnOrEcho($str)
{
    echo $str;
}

В вашем включенном файле PHP (или файле просмотра) у вас будет что-то вроде этого:

<?php returnOrEcho("hi1");?>
<?php returnOrEcho("hi3"."oo");?>
<?php returnOrEcho(6*7);?>

Я не смог получить preg_replace_callback встроенный обратный вызов, поэтому я использовал отдельную функцию, но есть пример того, как это сделать: preg_replace_callback() - возврат внутри текущего объекта экземпляр.