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

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

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

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

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

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

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

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

Например:

 // myinclude.php $value = 'foo'; $otherValue = 'bar'; return $value . $otherValue; // index.php $output = include './myinclude.php'; echo $output; // Will echo foobar 

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

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

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

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

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

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

Джори Себрехтс прав. Альтернативный и немного более простой метод доступен, если 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

Осторожно! Вы можете сделать оценку 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 () – возврат в текущий экземпляр объекта .