在 PHP 中,我想将文件读入变量并同时处理文件中的 PHP,而不使用输出缓冲。这可能吗?
本质上,我希望能够在不使用的情况下完成此操作ob_start()
:
<?php
ob_start();
include 'myfile.php';
$xhtml = ob_get_clean();
?>
这在PHP中可能吗?
更新:我想在输出回调中做一些更复杂的事情(不允许输出缓冲)。
在 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 位 ( )。这将eval()
退出 PHP 评估模式,并将文件的内容作为非 PHP 代码处理。然后,如果文件中有 PHP 代码块,这些代码块将被评估为 PHP。令人遗憾的是它不会将评估后的内容保存在变量中,它只是将其输出到页面。
谢谢大家的帮助!
Joeri Sebrechts 是正确的。如果 PHP 脚本可通过 HTTP 访问,则可以使用等效且稍微简单的方法:
$data = file_get_contents('http://google.com/');
应该注意的是,使用输出缓冲在资源上会更容易。
向 php 页面发出 curl 请求,本质上是伪装成浏览器。
如果文件是本地文件,您可以做的是将脚本作为字符串加载到变量中,然后在字符串上运行 eval 。然后你可以在之后做所有其他的事情。否则,您必须使用输出缓冲。
$fileData = file_get_contents('fileOnDisk.php');
$results = eval($fileData);
但是请查看 eval 上的文档,因为您实际上必须让您调用的文件返回其结果,而不仅仅是回显它们:
黑客警报!您可以使用一些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。