ob_start() 没有 ob_flush()

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 内容。我还搜索了所有包含的内容,但也没有看到其中的内容。

  1. 我检查过 implicit_flush 在此服务器上设置为 Off。因为我们确实从另一台服务器上移动了这段代码,可能在它所在的那台服务器上。但目前 API 仍在该服务器上运行。

  2. 当有人问是否有 ob_get_contents() 时我说 "not that I can find" 的原因是因为有包含其他文件的包含文件(包括 nusoap.php)文件,当我 grep 浏览它们并试图追踪它们时,我可能遗漏了一些东西并且仍在搜索中。但到目前为止,在我看来,没有发生冲洗或 get_contents。

一个可能的答案是 "NO, there has to either be an implicit_flush set in the php.ini file, or an implicit_flush() command somewhere, or another flush command somewhere, or getting the contents of the buffer somewhere - or the contents would never output." 对我来说,这就是手册的建议。但是有时候也有漏洞,PHP好像是漏洞语言

已解决

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

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

并在浏览器中看到输出。

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

在您的示例中,'print_r($result);' 会将输出发送到缓冲区,然后 PHP 解释器会将缓冲区发送到客户端 (http server/console)。

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