9

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

本质上,我希望能够在不使用的情况下完成此操作ob_start()

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

这在PHP中可能吗?

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

4

8 回答 8

26

PHP 的一个鲜为人知的特性是能够将包含/必需的文件视为函数调用,并带有返回值。

例如:

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


// index.php
$output = include './myinclude.php';
echo $output;
// Will echo foobar
于 2008-10-23T10:06:28.800 回答
9

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

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

于 2008-10-21T18:30:16.723 回答
4

在阅读了大家的建议,阅读了一堆文档并尝试了一些东西之后,我想出了这个:

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

它尽可能接近,但不幸的是它不起作用。?>这样做的关键是在文件内容之前包含结束 PHP 位 ( )。这将eval()退出 PHP 评估模式,并将文件的内容作为非 PHP 代码处理。然后,如果文件中有 PHP 代码块,这些代码块将被评估为 PHP。令人遗憾的是它不会将评估后的内容保存在变量中,它只是将其输出到页面。

谢谢大家的帮助!

于 2008-10-21T23:00:18.113 回答
1

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

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

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

于 2008-10-21T19:06:44.670 回答
0

向 php 页面发出 curl 请求,本质上是伪装成浏览器。

于 2008-10-21T18:31:25.973 回答
0

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

于 2008-10-21T18:50:03.877 回答
0
$fileData = file_get_contents('fileOnDisk.php');
$results = eval($fileData);

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

http://us2.php.net/eval

于 2008-10-21T22:52:09.720 回答
-1

黑客警报!您可以使用一些hackery 方法自己对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() - Calback inside current object instance

于 2014-10-30T15:23:01.443 回答