10

在我的网站(使用 drupal 运行)中,该ob_flush功能需要很长时间(10 - 100 秒之间)才能执行。我如何找出原因?是什么导致了这么长时间? 在此处输入图像描述

4

4 回答 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;

它对我来说运行得很快。

于 2014-02-03T22:02:20.040 回答
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() 不是正确的方法。

于 2014-02-19T23:33:55.557 回答
-1

output_buffering = Off

在 php.ini 中

于 2013-11-14T21:05:01.543 回答
-2

利用

<?ob_start();?>

在页面的开头和

 <?ob_flush();?>

在页面的末尾,来解决这个问题。

于 2013-03-29T06:55:16.290 回答