現在の位置: ホーム> 最新記事一覧> Flush()を使用すると有効になりますか?たぶん、あなたのWebサーバーのセットアップに何か問題があります

Flush()を使用すると有効になりますか?たぶん、あなたのWebサーバーのセットアップに何か問題があります

gitbox 2025-09-20
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 記事の内容に関係のないものがあります PHP コード</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"環境を初期化します...\n"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">ob_start</span></span><span>();
</span><span><span class="hljs-meta">?></span></span><span>

<hr>

</span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 記事が始まります</span></span><span>
</span><span><span class="hljs-meta">?></span></span><span>

<h1>使用 </span><span><span class="hljs-title function_ invoke__">flush</span></span><span>() 効果的ではありません?おそらくあなたのもの Web サーバーのセットアップには問題があります</h1>

<p>存在する PHP 開発中,`</span><span><span class="hljs-title function_ invoke__">flush</span></span><span>()` 函数常被使用来立即将输出发送到客户端,スクリプトが実行される前に均一に出力するまで待つ代わりに。它存在する实现长时间运行的任务、リアルタイムログディスプレイ、或者进度条更新时非常有使用。しかし,多くの開発者が問題に遭遇します:明明调使用了 <code></span><span><span class="hljs-title function_ invoke__">flush</span></span><span>()

2。Webサーバーバッファリング

PHP出力がフラッシュされたとしても、Webサーバー(Apache、Nginxなど)は、バッファがいっぱいになるかスクリプトが終了するまで出力をキャッシュし続けることがあります。一般的な状況:

  • Apache :mod_deflateまたはmod_gzip圧縮モジュールは出力を遅らせます。これらのモジュールの圧縮関数をオフにしたり、構成を調整したりすることができます。
  • NGINXGZIP圧縮はデフォルトで有効になり、 Proxy_Bufferingが存在するため、即時の出力も妨げられます。 proxy_buffering;ロケーションブロックに設定できます。

3。ブラウザの動作

一部のブラウザは、特に出力が非常に少ない場合、ページのレンダリングを開始する前に一定のデータを待機します。一般的な慣行:

  • コンテンツを出力する前に、十分なWhitespace文字を送信して、ブラウザをトリガーレンダリングにします。
  • 出力の前にhttpヘッダーを送信します: header( 'content-encoding:none');圧縮による遅延を防ぎます。

4。包括的な例
<span><span><?php</span></span><span>
</span><span><span>// PHP出力バッファリングを無効にします</span></span><span>
</span><span><span>while</span></span> <span>(</span> <span><span class="function_ invoke__">ob_get_level</span></span> <span>()></span> <span><span>0</span></span> <span>){
    </span><span><span class="function_ invoke__">ob_end_flush</span></span> <span>();
}

</span><span><span>エコー</span></span><span> </span><span><span class="function_ invoke__">str_repeat</span></span> <span>(</span> <span><span>""</span></span> <span>、</span> <span><span>1024</span></span> <span>);</span> <span><span>//ブラウザのレンダリングをトリガーするのにとてもなデータを送信します</span></span><span>

</span><span><span>for</span></span> <span>(</span> <span><span>$ i</span></span> <span>=</span> <span><span>1</span></span> <span>;</span> <span><span>$ i</span></span> <span><=</span> <span><span>5</span></span> <span>;</span> <span><span>$ i</span></span> <span>++){
    </span><span><span>エコー</span></span><span> </span><span><span>「処理ステップ<span>$ i</span></span></span> <span>...<br> \ n ";
    </span><span><span class="function_ invoke__">flush</span></span> <span>();
    </span><span><span class="function_ invoke__">寝る</span></span><span>(</span> <span><span>1</span></span> <span>);
}
</span><span><span>?></span></span><span>
</span></span><p>上記の方法を使使用すると、ほとんどの場合、 <span class="fun">Flush()が</span>普通に有効になることを確認できます。ただし、出力レイテンシは、PHP、Webサーバー、ブラウザの複数のリンクの複雑なな影響の結果であり、レイヤーごとにレイヤーをチェックする必要があることを忘れるれないでください。</p> <span><span><?php</span></span><span>
</span><span><span>//記事の終わりわりに、コンテンツの終わりわりはコンテンツに関連していません</span></span><span>
</span><span><span>エコー</span></span><span> </span><span><span>「記事はロードされています。\ n」</span></span> <span>;</span> <span><span>?></span></span><span>
</span></span></div></div>