在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文档中可以看出,没有。为什么要避免输出缓冲?

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

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

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

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

感谢大家的帮助!

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

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

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

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

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

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

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

http://us2.php.net/eval

黑客警报!您可以使用 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() - 在当前对象实例中进行回调

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top