PHP におけるスレッドセーフと非スレッドセーフとは何ですか? 質問する

PHP におけるスレッドセーフと非スレッドセーフとは何ですか? 質問する

PHP には、非スレッドやスレッドセーフなど、さまざまなバイナリがあるようです。

これはどういう意味ですか?

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

ベストアンサー1

並行性アプローチに関する必要な背景情報:

ウェブ サーバーごとに、受信 HTTP 要求を並列処理するためのさまざまな手法が実装されています。非常に一般的な手法はスレッドの使用です。つまり、ウェブ サーバーは受信要求ごとに 1 つのスレッドを作成して専用にします。Apache HTTP ウェブ サーバーは、要求を処理するための複数のモデルをサポートしています。そのうちの 1 つ (ワーカー MPM と呼ばれる) はスレッドを使用します。ただし、プロセスを使用する prefork MPM と呼ばれる別の並行処理モデルもサポートしています。つまり、ウェブ サーバーは要求ごとに 1 つのプロセスを作成して専用にします。

他にも、完全に異なる並行性モデル (非同期ソケットと I/O を使用) や、2 つまたは 3 つのモデルを組み合わせたモデルもあります。この質問に答えるために、ここでは上記の 2 つのモデルのみを取り上げ、Apache HTTP サーバーを例に挙げます。

PHP が Web サーバーとどのように「統合」されるかについて必要な背景情報:

PHP 自体は実際の HTTP リクエストに応答しません。これは Web サーバーの仕事です。したがって、Web サーバーを設定してリクエストを PHP に転送して処理し、結果を受信して​​ユーザーに返します。Web サーバーを PHP と連携させる方法は複数あります。Apache HTTP Server の場合、最も一般的なのは「mod_php」です。このモジュールは実際には PHP 自体ですが、Web サーバー用のモジュールとしてコンパイルされているため、Web サーバーの内部に直接ロードされます。

PHP を Apache や他の Web サーバーと連鎖させる方法は他にもありますが、mod_php が最も人気があり、あなたの質問への回答としても役立ちます。

ホスティング会社や GNU/Linux ディストリビューションには、私たちのために準備されたものがすべて揃っているので、これまではこれらの詳細を理解する必要がなかったかもしれません。

さて、あなたの質問に移りましょう!

mod_php を使用すると、PHP は Apache に直接ロードされるため、Apache が Worker MPM を使用して (つまり、スレッドを使用して) 同時実行を処理する場合、PHP はこの同じマルチスレッド環境内で動作できる必要があります。つまり、Apache と正しく連携するには、PHP がスレッドセーフである必要があります。

この時点で、「マルチスレッドのWebサーバーを使用していて、そこにPHPを埋め込む場合は、スレッドセーフ版のPHPを使用する必要があります」と考えるはずです。これは正しい考えです。しかし、実際には、PHPのスレッドセーフ大いに議論されている自分が何をしているのかを本当によくわかっている場合にのみ使用する分野です。

最後のメモ

ご参考までに、私の個人的なアドバイスとしては、選択肢がある場合はマルチスレッド環境で PHP を使用しないことです。

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

PHP のコマンドライン バージョンも見てみると、スレッドの安全性は問題ではありません。

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

おすすめ記事