在PHP中,有没有办法在不使用输出缓冲的情况下将PHP文件的输出捕获到变量中?

时间:2008-10-21 18:25:27

标签: php eval output-buffering

在PHP中,我想将文件读入变量并同时处理文件中的PHP,而不使用输出缓冲。这可能吗?

基本上我希望能够在不使用ob_start()的情况下完成此任务:

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

这可以在PHP中使用吗?

更新:我想在输出回调中做一些更复杂的事情(不允许输出缓冲)。

8 个答案:

答案 0 :(得分:26)

PHP的一个鲜为人知的功能是能够像处理函数一样处理包含/需要的文件,并返回值。

例如:

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


// index.php
$output = include './myinclude.php';
echo $output;
// Will echo foobar

答案 1 :(得分:9)

从我在PHP文档中可以看出,没有。为什么要避免输出缓冲?

解决这个问题的唯一方法是使用hacky方法,包括调用命令行php客户端或根据可用内容和特定要求执行curl请求。

答案 2 :(得分:4)

在阅读了每个人的建议,阅读了大量文档并玩弄了一些东西之后,我想出了这个:

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

它尽可能接近,但遗憾的是它不起作用。关键是要在文件内容之前包含结束PHP位(?>)。这将使eval()退出PHP评估模式,并将从非PHP代码开始处理文件的内容。然后,如果文件中有PHP代码块,那么它们将被评估为PHP。糟糕的是,它不会将变量中的eval'd内容保存,只是将其输出到页面。

感谢大家的帮助!

答案 3 :(得分:1)

Joeri Sebrechts是对的。 如果PHP脚本可以访问HTTP,则可以使用等效且稍微简单的方法:

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

应该注意的是,使用输出缓冲在资源上会更容易。

答案 4 :(得分:0)

向php页面做一个curl请求,基本上假装是浏览器。

答案 5 :(得分:0)

如果文件是本地的,您可以做的是将脚本作为字符串加载到变量中,然后对字符串运行eval。之后你可以做其他所有事情。否则,您必须使用输出缓冲。

答案 6 :(得分:0)

$fileData = file_get_contents('fileOnDisk.php');
$results = eval($fileData);

但请检查eval上的文档,因为您实际上必须让您正在调用的文件返回其结果而不是仅仅回显它们:

http://us2.php.net/eval

答案 7 :(得分:-1)

黑客警报!您可以使用preg_replace_callback来搜索和替换PHP块,并使用一些hackery来自己评估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() - Calback inside current object instance