ob_start() without an ob_flush()



我雇佣了一个人用PHP和MySQL为我编写一个API,现在必须自己维护它。我对php和其他语言不太了解。

我注意到,在他们拥有的大多数php文件的开头:

ob_start();

我知道这会打开一个新的输出缓冲区。问题是他们从不刷新缓冲区。代码一直运行良好,但我遇到了很多优化问题,服务器响应缓慢,等等。

为什么他们不必刷新缓冲区,但响应仍在返回?

例如:

ob_start();
include "nusoap.php";
include "config.php";
require_once "class.Database.php";
$client = new nusoap_client($config['apiURL'].'/server.php',false, false, false, false, false, 600, 600);
... process the $_GET and build a $result ...
print_r($result);

显然,... process ...是一个非常开放的东西。但我没有看到任何地方能冲洗或阅读ob的内容。我也搜索了所有的include,也没有在里面看到一个。

  1. 我检查了一下,在该服务器上implicit_flush设置为Off。由于我们确实从另一台服务器上移动了此代码,可能是在该服务器上。但目前此API仍在此服务器上工作。

  2. 当有人问我是否有ob_get_contents()时,我之所以说"我找不到",是因为有包含其他文件的包含文件(包括nusoap.php),虽然我已经浏览了它们并试图跟踪它们,但我可能遗漏了什么,仍在搜索中。但到目前为止,在我看来,没有出现脸红或get_contents的情况。

一个可能的答案是说"否,php.ini文件中必须有一个implicit_flush集,或者某个地方有一个implicit_flash()命令,或者某一个地方有另一个flush命令,或者在某个地方获取缓冲区的内容,否则内容永远不会输出。"对我来说,这就是手册的建议。但有时也会有漏洞,PHP似乎是一种漏洞百出的语言。

已解决

事实上,我做了一个简单的测试:

<?php
    ob_start();
    echo "Whats Up Doc!";
?>

并且在浏览器中可以看到输出。

PHP ob_start()函数的工作原理是将所有输出捕获到缓冲区,然后在脚本端隐式输出该缓冲区。您可以执行ob_end_clean()来丢弃(清理)缓冲区。

在您的示例"print_r($result);"中将输出发送到缓冲区,然后PHP解释器将缓冲区发送到客户端(http服务器/控制台)。

PS。函数ob_implicit_flush()有不同的含义。它只是在每次输出调用(如print或echo)时刷新缓冲区,对脚本完成没有影响。

最新更新