В 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/');
следует отметить, что использование буферизации вывода было бы проще для ресурсов.
Что вы можете сделать, если файл является локальным, это загрузить скрипт в переменную в виде строки, а затем запустить eval в строке. Потом ты сможешь делать все остальное. В противном случае необходимо использовать буферизацию вывода.
$fileData = file_get_contents('fileOnDisk.php');
$results = eval($fileData);
но проверьте документацию по 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 внутри текущего экземпляра объекта.