回答:
さまざまなWebサーバーが、着信HTTP要求を並行して処理するためのさまざまな手法を実装しています。かなり一般的な手法は、スレッドを使用することです。つまり、Webサーバーは、着信要求ごとに1つのスレッドを作成/専用化します。Apache HTTP Webサーバーは、リクエストを処理するための複数のモデルをサポートしています。そのうちの1つ(ワーカーMPMと呼ばれます)はスレッドを使用します。しかし、プロセスを使用するprefork MPMと呼ばれる別の同時実行モデルをサポートします。つまり、Webサーバーは要求ごとに1つのプロセスを作成/専用化します。
他の完全に異なる同時実行モデル(非同期ソケットとI / Oを使用)だけでなく、2つまたは3つのモデルを混在させるものもあります。この質問に答えるために、ここでは上記の2つのモデルのみを取り上げ、Apache HTTPサーバーを例として取り上げます。
PHP自体は実際のHTTPリクエストに応答しません-これはWebサーバーの仕事です。そのため、処理のためにリクエストをPHPに転送するようにWebサーバーを構成し、結果を受け取ってユーザーに送り返します。PHPでWebサーバーをチェーンする方法は複数あります。Apache HTTPサーバーの場合、最も一般的なのは「mod_php」です。このモジュールは実際にはPHP自体ですが、Webサーバー用のモジュールとしてコンパイルされているため、その中に直接読み込まれます。
PHPをApacheや他のWebサーバーと連鎖させる方法は他にもありますが、mod_phpが最も人気があり、質問への回答にも役立ちます。
ホスティング会社とGNU / Linuxディストリビューションにはすべての準備が整っているので、これらの詳細を理解する必要はなかったかもしれません。
mod_phpを使用すると、PHPはApacheに直接ロードされるため、ApacheがそのワーカーMPMを使用して(つまり、スレッドを使用して)並行性を処理する場合、PHPはこの同じマルチスレッド環境内で動作できる必要があります-つまり、PHPはApacheで正しくボールをプレーできるように、スレッドセーフである必要があります!
この時点で、「OK、つまりマルチスレッドWebサーバーを使用していて、それにPHPを直接埋め込む場合は、スレッドセーフバージョンのPHPを使用する必要がある」と考える必要があります。そして、これは正しい考えでしょう。ただし、実際には、PHPのスレッドセーフ性については異論があります。それは、あなたが実際に何をしているのかを知るための根拠です。
あなたは不思議に思っている場合は、私の個人的なアドバイスをすることですありません、マルチスレッド環境でPHPを使用ことです。
Unixベースの環境についてだけ言えば、幸いなことに、Apache WebサーバーでPHPを使用する場合にのみ、このことを考える必要があります。その場合、Apache(これは、prefork MPMを使用することをお勧めします)スレッドを使用しないため、PHPのスレッドセーフティは問題ではありません)と私が知っているすべてのGNU / Linuxディストリビューションは、パッケージシステムを通じてApache + PHPをインストールするときに、プロンプトを表示することなくその決定を行います選択のため。nginxやlighttpdなどの他のウェブサーバーを使用する場合は、いずれにしてもPHPを組み込むオプションはありません。あなたはFastCGIまたはPHPが完全に外にある別のモデルで機能する同等のものを使用することを見るでしょうFastCGIなどを介して要求に応答するために使用される複数のPHPプロセスを備えたWebサーバーの例。このような場合、スレッドセーフも重要ではありません。Webサイトが使用しているバージョンを確認するには、サイトに含ま<?php phpinfo(); ?>
れているファイルをServer API
入力して、エントリを探します。これは、CGI/FastCGI
またはのようなものApache 2.0 Handler
です。
PHPのコマンドラインバージョンも確認すると、スレッドの安全性は問題になりません。
最後に、スレッドセーフが問題ではない場合は、どのバージョンを使用する必要がありますか(スレッドセーフか非スレッドセーフか)。率直に言って、科学的な答えはありません!しかし、非スレッドセーフバージョンの方が高速でバグが少ない、またはそうでない場合は、スレッドセーフバージョンを提供するだけで、私たちに選択の余地がないと思います。
私は常に非スレッドセーフを選択します nginxを使用するか、コマンドラインからPHPを実行するため、常にバージョンを。
PHPをCGIバイナリ、コマンドラインインターフェース、または単一のスレッドのみが使用されるその他の環境としてインストールする場合は、非スレッドセーフバージョンを使用する必要があります。
複数のPHPスレッドが同時に実行されるワーカーMPM(マルチプロセッシングモデル)またはその他の環境にApacheモジュールとしてPHPをインストールする場合は、スレッドセーフバージョンを使用する必要があります。
構成/インストールが簡単なため、Apache MPM prefork with modphpが使用されます。パフォーマンスに関しては、かなり非効率的です。スタックを実行するための私の好ましい方法、FastCGI / PHP-FPM。そうすれば、はるかに高速なMPMワーカーを使用できます。PHP全体はスレッド化されませんが、Apacheはスレッド化された状態で(本来のように)機能します。
基本的に、下から上へ
Linux
Apache + MPMワーカー+ ModFastCGI(FCGIではない)|(または)| チェロキー語|(または)| Nginx
PHP-FPM + APC
ModFCGIは、PHP-FPM、または外部のFastCGIアプリケーションを正しくサポートしていません。プロセスで管理されていないFastCGIスクリプトのみをサポートします。PHP-FPMは、PHP FastCGIプロセスマネージャーです。
PHPのドキュメントに従って、
スレッドセーフとは、バイナリがWindows上のApache 2などのマルチスレッドWebサーバーコンテキストで機能することを意味します。スレッドセーフティは、データが別のスレッドと衝突しないように、各スレッドでローカルストレージコピーを作成することで機能します。
それで私は何を選びますか?PHPをCGIバイナリとして実行することを選択した場合、バイナリはリクエストごとに呼び出されるため、スレッドセーフは必要ありません。IIS5やIIS6などのマルチスレッドWebサーバーの場合、スレッドバージョンのPHPを使用する必要があります。
以下のライブラリはスレッドセーフではありません。マルチスレッド環境での使用は推奨されません。