ob_flush需要很长时间才能执行

10
我网站(使用Drupal运行)中的ob_flush函数执行时间很长(在10-100秒之间),如何找出原因?什么原因导致这么长的时间?请参考以下截图:enter image description here

你为什么认为这个函数会导致你的应用程序冻结? - ualinker
@ualinker 请查看我刚刚上传的图片。 - user16948
请问您能否附上使用 ob_start()ob_flush() 的代码示例? - ualinker
@rambocoder ob_list_handlers() 返回一个包含2个值的数组:"默认输出处理程序"。 - user16948
你尝试过增加缓冲区大小吗?在php.ini文件中有一个名为output_buffering的选项。 - Gediminas
显示剩余2条评论
4个回答

2

试试这个:

ob_start();
//Your code to generate the output
$result = ob_get_contents(); //save the contents of output buffer to a string
ob_end_clean();
echo $result;

对我来说运行速度很快。


1

[您可能需要使用Drupal标签标记您的问题,因为这似乎可能是Drupal问题。具体来说,我怀疑当您刷新缓冲区时,您正在写入外部缓冲区,从而触发调用大量挂钩以过滤您刚刚编写的数据。]

我怀疑您的问题是嵌套缓冲区。Drupal非常喜欢缓冲区,并且在各个地方都使用缓冲区。检查以下结果:

echo "<pre>\nBuffering level: ";
    . ob_get_level() .
    . "\nBuffer status:\n"
    . var_dump(ob_get_status(TRUE))
    . "\n</pre>";

如果您有嵌套的缓冲区,那么我怀疑ob_flush()对您没有任何作用:它只是将您内部缓冲区的内容附加到更外层的缓冲区中。
嵌套的缓冲区可能来自Drupal本身(如上所示),也可能来自zlib-output-compression和output_buffering的设置(尝试调整这些设置,看看是否有所改变)。
如果您的缓冲区没有嵌套,并且上述设置没有帮助,那么您可能还想将操作分成几个部分,并在那里运行分析器,以查看哪个部分需要时间。
$data = ob_get_contents(); // Return the contents of the output buffer.
ob_clean(); // Clean (erase) the output buffer.
ob_end(); // Close the buffer.
echo($data); // Output our data - only works if there's no outer buffer!
ob_start(); // Start our buffer again.

问题变成了,“你想要达到什么目的?” 你认为 ob_flush() 在这里做了什么?因为如果答案是“我想将我已经完成的所有工作推送到浏览器”... 那么恐怕 ob_flush() 不是正确的方法。

-1

设置

output_buffering = Off

在php.ini文件中


-2

使用

<?ob_start();?>

在页面开头处和

 <?ob_flush();?>

在页面末尾,以解决此问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接