2015-06-30 56 views
0

我雇了一个人在PHP和MySQL中为我编写一个API,现在必须自己维护它。我不知道PHP以及其他语言。ob_start()没有ob_flush()

我注意到在他们最有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. 我检查和​​设置为Off此服务器上。由于我们确实将该代码从另一台服务器移到了该服务器上。但目前这个API仍在使用这个服务器。

  2. 当有人问是否有ob_get_contents()时,我说“不是我可以找到”的原因是因为有包含其他文件的包含文件(包括nusoap.php),同时我已经通过它们并试图追查他们,我可能错过了一些东西,并仍在寻找。但到目前为止,在我看来,并没有发生flush或get_contents事件。

一个可能的答案是说“NO,必须有或者是在php.ini文件中的implicit_flush集,或implicit_flush()命令的地方,或其他清洗命令的地方,或获取的内容某处的缓冲区 - 或内容永远不会输出。“对我来说,这是手册的建议。但有时候会有漏洞,而PHP似乎是漏洞的语言。

解决

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

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

,并在浏览器中输出看到。

+0

'ob_get_contents'? 'ob_get_clean'? –

+0

nope ...不是我能找到的。我在“ob_”的所有文件中搜索了一下所有的东西。 – badweasel

+0

@badweasel“不是我可以找到的”..任何IDE(甚至文本编辑器)都应该有一个ctrl + f功能 –

回答

1

PHP ob_start()函数通过捕获所有输出到缓冲区,然后在脚本末端上隐式输出此缓冲区。 您可以执行ob_end_clean()来放弃(清除)缓冲区。

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

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

+0

所以你说,即使没有任何刷新命令或隐式刷新选项打开,当它到达PHP脚本的末尾它仍然会输出缓冲区? – badweasel

+0

这是正确的。 –

+0

谢谢!那么为什么人们问我是否知道如何搜索文件?看起来很奇怪,因为看到这是一个合法的问题,所以我会拿这样的问题来回答这个问题。 – badweasel