В PHP я хочу прочитать файл в переменной и обрабатывать PHP в файле одновременно без использования буферизации вывода. Это возможно?
По сути, я хочу, чтобы это удалось, без использования ob_start()
:
<?php ob_start(); include 'myfile.php'; $xhtml = ob_get_clean(); ?>
Возможно ли это в 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, потому что на самом деле вам нужно, чтобы файл, который вы вызываете, возвращал свои результаты, а не просто повторял их:
Осторожно! Вы можете сделать оценку 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 () – возврат в текущий экземпляр объекта .