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

StackOverflow https://stackoverflow.com/questions/222925

  •  03-07-2019
  •  | 
  •  

Вопрос

В 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-клиента из командной строки, либо выполнение запроса curl на основе того, что доступно и каковы конкретные требования.

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

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

Это так близко, как я мог получить, но, к сожалению, это не работает. Ключом к этому является включение закрывающего бита PHP (? & Gt; ) перед содержимым файла. Это выведет 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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top