在我的网站(使用drupal运行)中,ob_flush
函数需要很长时间(10到100秒)才能执行。我如何找出原因?什么能导致这么长时间?
答案 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中