В PHP, есть ли способ записать вывод файла PHP в переменную без использования буферизации вывода?
В PHP я хочу прочитать файл в переменную и одновременно обработать PHP в файле без использования буферизации вывода. Это возможно?
По сути, я хочу быть в состоянии сделать это без использования ob_start()
:
<?php
ob_start();
include 'myfile.php';
$xhtml = ob_get_clean();
?>
Это возможно в PHP?
Обновление: я хочу сделать более сложные вещи в обратном вызове вывода (где буферизация вывода не разрешена).
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 в переменной, он просто выводит его на страницу.
Спасибо всем за помощь!
Джори Себрехтс прав. Эквивалентный и немного более простой метод доступен, если PHP-скрипт доступен по HTTP:
$data = file_get_contents('http://google.com/');
Следует отметить, что использование буферизации вывода будет проще для ресурсов.
Что вы можете сделать, если файл локальный, это загрузить скрипт в переменную в виде строки, а затем запустить eval для этой строки. Затем вы можете делать все остальные вещи потом. В противном случае вы должны использовать буферизацию вывода.
$fileData = file_get_contents('fileOnDisk.php');
$results = eval($fileData);
Но посмотрите документацию по eval, потому что вам нужно, чтобы файл, который вы вызываете, возвращал его результаты, а не просто выводил их:
Сделайте запрос curl к php-странице, по сути притворившись браузером.
Взломать оповещение! Вы могли бы сделать оценку 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 () - обратный вызов внутри текущего экземпляра объекта.