895

非スレッドやスレッドセーフなど、PHP のさまざまなバイナリを見ました。

これは何を意味するのでしょうか?

これらのパッケージの違いは何ですか?

4

4 に答える 4

747

同時実行アプローチに関する必要な背景:

Web サーバーが異なれば、着信 HTTP 要求を並行して処理するためのさまざまな手法が実装されます。非常に一般的な手法は、スレッドを使用することです。つまり、Web サーバーは、着信要求ごとに 1 つのスレッドを作成/専用化します。Apache HTTP Web サーバーは、リクエストを処理するための複数のモデルをサポートしています。そのうちの 1 つ (ワーカー MPM と呼ばれます) はスレッドを使用します。ただし、プロセスを使用する prefork MPM と呼ばれる別の同時実行モデルをサポートしています。つまり、Web サーバーは各リクエストに対して単一のプロセスを作成/専用化します。

他の完全に異なる同時実行モデル (非同期ソケットと I/O を使用) や、2 つまたは 3 つのモデルが混在するものもあります。この質問に答える目的で、上記の 2 つのモデルのみに関心を持ち、例として Apache HTTP サーバーを取り上げます。

PHP が Web サーバーとどのように「統合」されるかについての背景が必要です。

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 が Worker MPM を使用して (つまり、スレッドを使用して) 並行処理を処理する場合、PHP はこの同じマルチスレッド環境内で動作できなければなりません。つまり、PHP はApache で正しくボールをプレーできるように、スレッドセーフにします!

この時点で、「マルチスレッド Web サーバーを使用していて、そこに PHP を埋め込む場合は、スレッドセーフ バージョンの PHP を使用する必要がある」と考えるはずです。そして、これは正しい考え方でしょう。しかし、たまたま、PHP のスレッドセーフ性は大いに議論されています。それは、自分が何をしているのかを本当に知っている場合に使用する場所です。

最終的な注意事項

ご参考までに、私からの個人的なアドバイスは、マルチスレッド環境では PHP を使用しないことです。

Unix ベースの環境について言えば、幸いなことに、Apache Web サーバーで PHP を使用する場合にのみ、このことを考える必要があります。その場合、Apache の prefork MPM (これははスレッドを使用しないため、PHP スレッド セーフは重要ではありません)、私が知っているすべての GNU/Linux ディストリビューションは、パッケージ システムを使用して Apache + PHP をインストールするときに、プロンプトを表示することさえせずに、その決定を行います。選択のために。nginxlighttpdなどの他の Web サーバーを使用する場合は、PHP をそれらに埋め込むオプションはありません。PHPが完全に外部にある別のモデルで機能するFastCGIまたは同等のものの使用を検討します。たとえば、FastCGI を介してリクエストに応答するために使用される複数の PHP プロセスを備えた Web サーバーの。そのような場合、スレッドセーフも重要ではありません。あなたのウェブサイトが使用しているバージョンを確認するには、<?php phpinfo(); ?>あなたのサイトに を含むファイルを置き、エントリを探してくださいServer API。これは、CGI/FastCGIまたはのようなことを言うことができますApache 2.0 Handler

PHP のコマンドライン バージョンも見てみると、スレッド セーフは重要ではありません。

最後に、スレッド セーフが重要でない場合、スレッド セーフと非スレッド セーフのどちらのバージョンを使用する必要がありますか? 率直に言って、私は科学的な答えを持っていません! しかし、スレッドセーフではないバージョンの方が高速でバグが少ないと思います。そうでなければ、スレッドセーフなバージョンを提供しただけで、私たちに選択肢を与えようとはしませんでした!

于 2011-05-12T13:37:56.557 に答える
308

私は常に nginx を使用するか、コマンド ラインから PHP を実行するため、非スレッド セーフ バージョンを選択します。

PHP を CGI バイナリ、コマンド ライン インターフェイス、またはシングル スレッドのみが使用されるその他の環境としてインストールする場合は、非スレッド セーフ バージョンを使用する必要があります。

複数の PHP スレッドが同時に実行されるワーカー MPM (マルチプロセッシング モデル) またはその他の環境に PHP を Apache モジュールとしてインストールする場合は、スレッド セーフ バージョンを使用する必要があります。

于 2010-11-21T17:34:59.533 に答える
30

modphp を使用した Apache MPM プリフォークは、構成/インストールが簡単であるため使用されます。パフォーマンスに関しては、かなり非効率的です。スタックを行うための私の好みの方法は、FastCGI/PHP-FPM です。そうすれば、はるかに高速な MPM ワーカーを使用できます。PHP 全体はスレッド化されていませんが、Apache はスレッド化されています (そうあるべきです)。

基本的には下から上へ

Linux

Apache + MPM ワーカー + ModFastCGI (FCGI ではない) |(または)| チェロキー|(または)| ニンクス

PHP-FPM + APC

ModFCGI は、PHP-FPM や外部 FastCGI アプリケーションを正しくサポートしていません。非プロセス管理の FastCGI スクリプトのみをサポートします。PHP-FPM は、PHP FastCGI プロセス マネージャーです。

于 2011-07-18T17:55:07.930 に答える