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

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

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

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

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

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

8 ответов


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

например:

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


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

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

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


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

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

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

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


Joeri Sebrechts правильно. Эквивалентный и немного более простой метод доступен, если PHP-скрипт доступен по протоколу HTTP:

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

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


сделайте запрос curl на страницу php, по существу притворяясь браузером.


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


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

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

http://us2.php.net/eval


Hack Alert! Вы можете сделать оценку PHP самостоятельно с помощью немного hackery, используя 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 встроенный обратный вызов работает, поэтому я использовал отдельную функцию, но есть пример того, как это сделать:праздник() - Calback внутри текущего экземпляра объекта.