ホームページ >バックエンド開発 >PHPチュートリアル >PHP はデータを 1 行ずつ出力し、バッファリングに関連する 2 つの一般的な問題を解決します
PHP はデータを 1 行ずつ出力し、2 つの一般的なバッファリングの問題を解決します
このブロガーは、さまざまなインターネット技術に熱心で、しばしば強迫性障害を伴います。頻繁に更新しており、その記事が正しいと思われる場合は、フォローしてください。 「Dark Blue Sickle」と明記してください
次の 2 つの状況に遭遇したことがあるのではないでしょうか:
上記の 2 つの状況に遭遇した場合、または将来そのような問題に直面する可能性がある場合は、次回すぐに解決できるようにマークを付けることができます。
仕事に戻ります。
以下は PHP 出力制御の壮大な紹介です 出力バッファ
まず、次のコードの効果を試してください
<?phpif (ob_get_level() == 0){ ob_start() }else{ exit(0);};//开始缓冲for ($i = 0; $i<10; $i++){ echo "Line to show.\n<br />";//不直接输出,先存入缓冲区中 ob_flush();//将缓冲区的数据输出出来 flush();//将缓冲区的数据输出出来 sleep(2);//暂停两秒}echo "Done.";ob_end_flush();//关闭并清理缓冲区
原則として、PHP はデータを出力する前にデータを バッファ に入れて待機します。必要に応じてバッファリングされたデータ。これを Cache と混同しないように注意してください。
これの利点は、一方では遅延読み込みと同様の優れた効果を実現できることですが、他方では、サーバーとクライアントの負荷を軽減しないと、出力に大きなデータがある場合、メモリが不足します。
注: ob_flush() および flush( ) はバッファ データをフラッシュするために使用されますが、公式の推奨事項は を と組み合わせて使用することです。これは、ほとんどの Web サーバーでは ob_flush() のみが実行できるためですバッファをフラッシュしますが、Apache などの一部のケースでは、flush() を呼び出す必要がある場合があるため、コードの 移植性を確保するために、 は ob_flush()すぐにflush()を最後に追加します。
<?phpob_start();$data = [1,2,3,4,5,6,7,8,9,10];//实际数据更多,为方便距离假设浏览器一次输出10条会卡死$per = 3;//每次输出3条,可以改成1000 for ($i = 0;$i < count($data); $i+= $per){ for($j = $i; $j < $i + $per && $j <count($data); $j++){ echo $data[$j]; } ob_flush(); flush(); sleep(2);}echo "Done.";ob_end_flush();
4.解决header实现文件下载时文件过大导致卡死的问题
<?phpheader('Content-type: application/txt');//输出类型ob_start();$data = "qwertyuioasdfghjkl";//文件内容,file_get_contents($file)$per = 15;//每次输出15个字符,可以改成1000或更大 for ($i = 0;$i < strlen($data); $i+= $per){ for($j = $i; $j < $i + $per && $j <strlen($data); $j++){ echo $data[$j]; } sleep(2); ob_flush(); flush();}echo "Done."; ob_end_flush();