【问题标题】:ob_start() without an ob_flush()没有 ob_flush() 的 ob_start()
【发布时间】:2015-06-30 06:50:49
【问题描述】:

我雇了一个人用 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),而我已经通过了他们并试图追踪他们,我可能错过了一些东西并且仍在寻找。但到目前为止,在我看来,flush 或 get_contents 没有发生。

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

已解决

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

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

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

【问题讨论】:

  • ob_get_contents? ob_get_clean?
  • 不...不是我能找到的。我在所有文件中搜索了“ob_”,看看都用了什么。
  • @badweasel “我找不到”.. 任何 IDE(甚至文本编辑器)都应该有 ctrl+f 功能
  • 他正在使用 nusoap.php
  • 好的..我将改写为“不”。更好?

标签: php nusoap output-buffering


【解决方案1】:

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

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

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

【讨论】:

  • 所以你的意思是即使没有打开任何刷新命令或隐式刷新选项,当它到达 php 脚本的末尾时它仍然会输出缓冲区?
  • 谢谢!那么为什么人们会问我是否知道如何搜索文件呢?看到这是一个合法的问题,我会因为问这个问题而接受这样的废话,这似乎很奇怪。
猜你喜欢
  • 1970-01-01
  • 2011-02-19
  • 1970-01-01
  • 2015-05-09
  • 1970-01-01
  • 2013-08-03
  • 1970-01-01
  • 2015-08-15
  • 1970-01-01
相关资源
最近更新 更多