В PHP, есть ли способ записать вывод файла PHP в переменную без использования буферизации вывода? - PullRequest
9 голосов
/ 21 октября 2008

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

По сути, я хочу быть в состоянии сделать это без использования ob_start():

<?php
ob_start();
include 'myfile.php';
$xhtml = ob_get_clean();
?>

Возможно ли это в PHP?

Обновление: я хочу сделать более сложные вещи в обратном вызове вывода (где буферизация вывода не разрешена).

Ответы [ 8 ]

26 голосов
/ 23 октября 2008

Малоизвестная особенность PHP - возможность обрабатывать включенный / требуемый файл как вызов функции с возвращаемым значением.

Например:

// myinclude.php
$value = 'foo';
$otherValue = 'bar';
return $value . $otherValue;


// index.php
$output = include './myinclude.php';
echo $output;
// Will echo foobar
9 голосов
/ 21 октября 2008

Из того, что я могу сказать в документации PHP, нет. Почему вы хотите избежать буферизации вывода?

Единственный способ обойти это - хакерские методы, включающие либо вызов php-клиента из командной строки, либо выполнение запроса curl на основе того, что доступно и каковы конкретные требования.

4 голосов
/ 22 октября 2008

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

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

Это как можно ближе, но, к сожалению, не работает. Ключом к этому является включение закрывающего бита PHP (?>) перед содержимым файла. Это выведет eval() из режима оценки PHP и будет обрабатывать содержимое файла, начиная с кода, отличного от PHP. Затем, если в файле есть блоки кода PHP, они будут оцениваться как PHP. Облом является то, что он не сохраняет содержимое eval'd в переменной, он просто выводит его на страницу.

Спасибо всем за помощь!

1 голос
/ 21 октября 2008

Джори Себрехтс прав. Эквивалентный и немного более простой метод доступен, если PHP-скрипт доступен по HTTP:

$data = file_get_contents('http://google.com/');

Следует отметить, что использование буферизации вывода будет проще для ресурсов.

0 голосов
/ 30 октября 2014

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

0 голосов
/ 22 октября 2008
$fileData = file_get_contents('fileOnDisk.php');
$results = eval($fileData);

Но посмотрите документацию по eval, потому что вам нужно, чтобы файл, который вы вызываете, возвращал его результаты, а не просто отображал их:

http://us2.php.net/eval

0 голосов
/ 21 октября 2008

Что вы можете сделать, если файл локальный, загрузить скрипт в переменную в виде строки, а затем запустить eval для этой строки. Затем вы можете делать все остальные вещи потом. В противном случае вы должны использовать буферизацию вывода.

0 голосов
/ 21 октября 2008

Сделайте запрос curl на страницу php, по сути притворившись браузером.

...