ob_flush需要很长时间才能执行

时间:2012-12-16 17:56:36

标签: php performance drupal-7 output-buffering

在我的网站(使用drupal运行)中,ob_flush函数需要很长时间(10到100秒)才能执行。我如何找出原因?什么能导致这么长时间? enter image description here

4 个答案:

答案 0 :(得分: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 :(得分: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.

然而,问题就变成了#34;你想要完成什么?&#34;您认为ob_flush()在这里做什么?因为如果答案是&#34;我想把我迄今为止所做的一切都推到浏览器中......那么我担心ob_flush()不是正确的方式。

答案 2 :(得分:-1)

使用

<?ob_start();?>

在页面的开头

 <?ob_flush();?>

在页面的最后,解决这个问题。

答案 3 :(得分:-1)

SET

output_buffering = Off

在php.ini中

相关问题