6

こんにちは、私の質問は、データ フローが Apache Web サーバー + PHP で正確にどのように機能するかです。

ユーザーが url: localhost/index.php にアクセスし、同時に別のユーザーが同じ URL にアクセスすると、リクエストが 1 つずつ実行され (マルチスレッドではなく)、最初のユーザーが応答を取得してから別のユーザーが応答を取得すると思います。

問題は、最初のリクエストが 1 分間のように長時間ループにとどまる場合、他のユーザーは最初のリクエストが完了するのを待ってから、Apache Web サーバー + PHP からの応答を取得するためにリクエストが完了するのを待つ必要があるかどうかです。答えが「はい」の場合 (他のユーザーはキューで待機する必要があります): キューで待機するのを防ぐために、並行して実行される要求 (マルチスレッド) を作成できますか?

4

2 に答える 2

10

PHPはシングルスレッドの場合がありますが、Apacheはマルチプロセスおよびマルチスレッドを実行できます。これにより、多くのリクエストを同時に実行できます。実際に同時に要求する数を構成できます。

これらのリクエストをライブで処理しているApacheを実際に確認し、待機中のリクエストとmod_status(http://httpd.apache.org/docs/2.2/mod/mod_status.html)を介してサービスされているリクエストを確認できます。

于 2013-02-20T10:52:01.837 に答える
3

Apacheには複数のスレッドがあるため、複数のPHPスクリプトを同時に実行できます。

NginxなどのWebサーバーは、イベント駆動型アーキテクチャを使用しています。非同期I/Oとそのすべてのジャズ。

Webサーバーには通常、一度に複数のリクエストを処理できるようにする、または少なくともできるように見せるための何らかのメカニズムがあります。

Apacheはスレッドを使用し、Nginxはイベントループを使用しますが、必要な意味でシリアルではありません。その理由は非常に単純です。それはリソースを浪費します。PHPスクリプトがハードディスクが正しい位置に移動するのを待っている間、読んでいるファイルからブロックを読み取ることができるので、他のことをしている可能性があります。現在I/Oを必要としない別のリクエストを処理します。

他のユーザーがリクエストを行う前に一部のリクエストが終了することが重要な場合は、より分離された非同期アーキテクチャへの切り替えを検討する必要があります。現在のソリューションにどれだけ投資しているかわかりません。イベント処理は、単純なポーリングまたは長いポーリングと同じくらい簡単に実装できます。

于 2013-02-20T10:54:57.343 に答える