web-dev-qa-db-ja.com

PHPのスレッドセーフまたは非スレッドセーフとは何ですか?

私はPHPのために異なるスレッドを見ました、非スレッドセーフまたはスレッドセーフのような?これは何を意味するのでしょうか?これらのパッケージの違いは何ですか?

715
O..

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

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

他の完全に異なる並行性モデル(非同期ソケットとI/Oを使用)、および2つまたは3つのモデルを混在させるものもあります。この質問に答えるために、上記の2つのモデルに関心を持ち、Apache HTTPサーバーを例として取り上げます。

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

PHP自体は実際のHTTPリクエストには応答しません - これがWebサーバーの仕事です。そこで、処理のためにリクエストをPHPに転送し、その結果を受け取ってそれをユーザーに送り返すようにWebサーバーを構成します。 WebサーバーをPHPとチェーンさせる方法は複数あります。 Apache HTTPサーバーの場合、最も一般的なものは "mod_php"です。このモジュールは実際にはPHPそのものですが、Webサーバー用のモジュールとしてコンパイルされているため、その中にロードされます。

PHPをApacheや他のWebサーバーとチェーニングする方法は他にもありますが、mod_phpは最も一般的な方法であり、質問に答えるためにも役立ちます。

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

さて、あなたの質問に!

Mod_phpでは、PHPがApacheに正しくロードされるため、ApacheがWorker MPMを使用して(つまりスレッドを使用して)並行処理を処理する場合、PHPはこの範囲内で動作できる必要があります。同じマルチスレッド環境 - つまり、PHPは、Apacheで正しくボールをプレーできるようにするためにスレッドセーフでなければなりません!

この時点で、あなたは「OK、それでマルチスレッドWebサーバを使っていて、それにPHPを埋め込むつもりなら、スレッドセーフバージョンを使わなければなりません。 PHP "#:。そしてこれは正しい考え方でしょう。しかし、それが起こるにつれて、PHPのスレッドセーフ は非常に論争されています 。それはあなたが本当に本当に本当に知っているあなたがしていることを利用する場です。

最終メモ

ご参考までに、私の個人的なアドバイスは、マルチスレッド環境ではnotuse PHPを選択してください。

Unixベースの環境についてだけ言えば、幸いなことに、Apache WebサーバーでPHPを使用するのであれば、これを考慮する必要があるだけです。 ApacheのMPM(スレッドを使用しないので、PHP thread-safetyは関係ありません)およびインストールするときに私が知っているすべてのGNU/Linuxディストリビューションはあなたのためにその決定をするでしょうApache + PHP彼らのパッケージシステムを通して、あなたに選択を促すことすらありません。 nginx または lighttpd などの他のWebサーバーを使用する場合は、とにかくPHPを埋め込むことはできません。 FastCGI またはPHPが複数のPHPを持つWebサーバーの完全にoutsideである異なるモデルで動作する同等のものを使用することを検討します。以下を通してリクエストに答えるために使用されるプロセスFastCGIそのような場合、スレッドセーフも重要ではありません。 Webサイトで使用されているバージョンを確認するには、サイトに<?php phpinfo(); ?>を含むファイルを置き、Server APIエントリを探します。これはCGI/FastCGIApache 2.0 Handlerのようなものを言うことができます。

PHPのコマンドラインバージョンも見れば、スレッドの安全性は問題になりません。

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

621
Amr Mostafa

私にとっては、 常にnginxを使用するか、コマンドラインからPHPを実行するので、常にスレッドセーフではない versionを選択します。

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

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

248
Greg

設定/インストールが簡単なため、modphpを使用したApache MPM preforkが使用されます。パフォーマンス的には、かなり非効率的です。 FastCGI/PHP-FPMを使ってスタックを作成するのが好きです。そうすれば、はるかに高速のMPMワーカーを使用できます。 PHP全体はスレッド化されていませんが、Apacheはスレッド化されたサービスを提供します(本来のように)。

だから基本的に、下から上へ

Linux

Apache + MPMワーカー+ ModFastCGI(FCGIではありません)|(または)|チェロキー|(または)| Nginx

PHP-FPM + APC

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

28
J. M. Becker

PHP Documentation 、のように

PHPをダウンロードするとき、スレッドセーフはどういう意味ですか?

スレッドセーフとは、バイナリがWindows上のApache 2などのマルチスレッドWebサーバコンテキストで動作できることを意味します。スレッドセーフティは、各スレッドにローカルストレージコピーを作成することによって機能し、データが別のスレッドと衝突しないようにします。

だから私は何を選ぶのですか? PHPをCGIバイナリとして実行することを選択した場合、バイナリはリクエストごとに呼び出されるので、スレッドセーフを必要としません。 IIS 5やIIS 6などのマルチスレッドWebサーバーの場合は、スレッド版のPHPを使用する必要があります。

以下のライブラリはスレッドセーフではありません。マルチスレッド環境での使用は推奨されていません。

  • SNMP(Unix)
  • mSQL(Unix)
  • IMAP(Win/Unix)
  • Sybase-CT(Linux、libc5)
19
Somnath Muluk