В 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() - возврат внутри текущего объекта экземпляр.