没有ob_flush()的ob_start()

时间:2015-06-30 06:50:50

标签: php nusoap output-buffering

我聘请了某人在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内容。我也搜索了所有包含内容,但也没有看到其中的一个。

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

  2. 我说的原因"不是我能找到"当有人问是否有一个ob_get_contents()是因为有包含其他文件的包含文件(包括nusoap.php),而我已经通过它们并试图追踪它们,我可能已经错过了一些东西而且仍然是搜索。但到目前为止,我认为没有发生冲洗或get_contents。

  3. 一个可能的答案是说" NO,必须要么在php.ini文件中设置implicit_flush,要么在某处设置implicit_flush()命令,或者在某个地方设置另一个flush命令,或者获取其中的内容。在某处缓冲 - 或者内容永远不会输出。"对我而言,这是手册所暗示的。但有时存在漏洞,PHP似乎是漏洞的语言。

    解决

    确实我做了一个简单的测试:

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

    并在浏览器中显示输出。

1 个答案:

答案 0 :(得分:1)

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

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

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