web-dev-qa-db-ja.com

PHP(を使用して-スレッド、スレッドプール、または子プロセスを使用)での同時リクエストの処理方法

PHPは複数の同時接続の処理をサポートし、サーバーに応じて、この answer

サーバーは複数の接続をどのように管理しますか?リクエストごとに子プロセスをフォークするか、スレッドを使用して処理するか、スレッドプールを使用して処理しますか?

リンクされた回答 はプロセスがフォークされ、コメントの著者がスレッドまたはプロセスを言っているため、子プロセス、スレッド、またはスレッドプールを使用してリクエストが処理される場合、混乱を招きますか?

28
prasun

私が知っているように、すべてのウェブサーバーには、複数の同時リクエストを処理する独自の種類があります。通常、Apache2は新しいリクエストごとに子プロセスをフォークします。ただし、リンクされたStackOverflowの回答に記載されているように、この動作を何らかの方法で構成できます。

たとえば、Nginxはすべてのリクエストを1つのスレッドで取得し(Node.jsのように非同期で新しい接続を処理します)、キャッシュを使用することもあります(設定どおり。NginxはロードバランサーまたはHTTPプロキシとしても使用できます)。これは、アプリケーションに適したWebサーバーを選択することです。

Apache2は非常に優れたWebサーバーになる可能性がありますが、実稼働環境で使用するには、より多くの負荷分散が必要です。しかし、複数の短時間持続する接続、またはまったく変更されない(またはキャッシュを使用する)ドキュメントでさえも、優れたパワーを備えています。

Nginxは、処理時間が長く、長時間持続する接続が多い場合に非常に役立ちます。その場合、それほど多くの負荷分散は必要ありません。

私はこれであなたを助けることができたと思います;)

ソース:

https://httpd.Apache.org/docs/2.4/mod/worker.html

https://anturis.com/blog/nginx-vs-Apache/

以下も参照することをお勧めします。 PHPでスレッドセーフまたは非スレッドセーフとは何ですか?

20
jankal

いくつかの研究を行った後、以下の結論に至りました。

PHPサーバーがそれについての洞察を得ることができるように設定されている方法を考慮することが重要です。サーバーとPHPを独自に設定するには、 3つの可能性がある:

1)PHP=モジュールとしての使用(多くのサーバーの場合PHPには直接モジュールインターフェイス(SAPIとも呼ばれます)))

2)CGI

3)FastCGI

Case#1 PHPをモジュールとして考えると、この場合、モジュールはWebサーバー自体と統合され、フォークプロセスに関してリクエストを処理する方法を完全にWebサーバーに配置します。スレッド、スレッドプールなど.

モジュールの場合、Apache mod_phpが非常に一般的に使用されているようであり、Apache自体は、この answer

Prefork MPMは、それぞれ1つのスレッドを持つ複数の子プロセスを使用し、各プロセスは一度に1つの接続を処理します。

ワーカーMPMは、それぞれ多数のスレッドを持つ複数の子プロセスを使用します。各スレッドは一度に1つの接続を処理します。

明らかに、他のサーバーは他のアプローチを取るかもしれませんが、私は同じことを知りません。

#2と#3の場合、WebサーバーとPHP部分は異なるプロセスで処理され、Webサーバーが要求を処理する方法とアプリケーション(PHP部分)でさらに処理される方法は異なります。例:NGINXは非同期ノンブロッキングI/Oを使用してリクエストを処理し、Apacheはスレッドを使用してリクエストを処理しますが、FastCGIまたはCGIアプリケーションによるリクエストの処理方法は、以下に説明するように異なる側面です。サーバーはリクエストを処理し、PHP一部が処理される方法はPHPサーバーのパフォーマンスにとって重要です。

#2を考慮すると、CGIプロトコルによりWebサーバーとアプリケーション(PHP)は互いに独立しているため、CGIプロトコルではアプリケーションとWebサーバーを異なるプロセスで処理する必要があり、プロトコルは同じプロセスの再利用を促進しません。各プロセスを処理するには新しいプロセスが必要です。

#3を考慮すると、FastCGIプロトコルはプロセスの再利用を可能にすることにより、CGIの制限を克服します。 IIS FastCGIリンク をチェックすると、FastCGIは、1つのプロセスを何度も何度も再利用するメカニズムを提供することにより、CGIに固有のパフォーマンスの問題に対処します。

FastCGIは、再利用可能なプロセスのプールを提供し、各プロセスが一度に1つの要求のみを処理するようにすることにより、非スレッドセーフライブラリとの互換性を維持します。

とはいえ、FastCGIの場合、サーバーはプロセスプールを維持し、そのプロセスプールを使用して着信クライアント要求を処理するようです。プロセスプールはスレッドセーフチェックを必要としないため、良好なパフォーマンスを提供します。

4
prasun

答えは、Webサーバーとcgiのデプロイ方法に依存すると思います。

私の会社では、NginxをWebサーバーとして使用し、php-fpmをcgiとして使用しているため、同時要求はスレッドではなくphp-fpmによってプロセスとして処理されます。

最大プロセス数を設定し、各リクエストは単一のphpプロセスによって処理されます。さらに多くのリクエスト(最大プロセス数よりも大きい)が来た場合、それらは待機します。

だから、PHP自体がそれらのすべてをサポートできると信じていますが、それをどのように使用するかは依存します。

4
FisherMartyn

PHPはリクエストを処理しません。 Webサーバーはそうします。

にとって Apache HTTP Server、最も一般的なのは「mod_php」です。このモジュールは、実際にはPHP自体ですが、Webサーバー用のモジュールとしてコンパイルされているため、その中に直接読み込まれます。

Mod_phpでは、PHPはApacheに直接読み込まれます。ApacheがワーカーMPMを使用して並行処理を行う場合(つまり、Threadsを使用する場合)

nginx PHPは完全にWebサーバーの外部にあり、複数のPHP processes

non-thread safeまたはthread safe PHP。

ただし、setlocale()関数(サポートされている場合)は、実際にオペレーティングシステムのプロセスステータスを変更し、スレッドセーフではありません。

レガシコードがどのように機能するかわからない場合は、覚えておく必要があります。

1