私のWebサイト(drupalで実行)では、ob_flush
関数の実行に長い時間がかかります(10〜100秒)。理由を知るにはどうすればよいですか?これほど長い時間がかかる原因は何ですか?
4 に答える
これを試して:
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;
それは私のために速く実行されます。
[これは 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() が正しい方法ではないのではないかと心配しています。
設定
output_buffering = Off
php.iniで
使用する
<?ob_start();?>
ページの先頭と
<?ob_flush();?>
ページの最後で、この問題を解決します。