696

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


4 답변


606

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

異なる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は同じマルチスレッド環境内で動作できなければなりません。Apacheで正しくボールをプレーできるようにするには、PHPがスレッドセーフでなければなりません。

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

最終メモ

ご参考までに、私の個人的なアドバイスはではないあなたが選択があるならマルチスレッド環境でPHPを使ってください!

Unixベースの環境についてだけ言えば、幸いなことに、Apache WebサーバーでPHPを使用するのであれば、これを考慮する必要があるだけです。その場合は、Apacheのprefork MPMを使用することをお勧めします。スレッドを使用しないので、PHPのスレッドセーフ性は重要ではありません)そして私が知っているすべてのGNU / Linuxディストリビューションでは、あなたにプロンプトを表示することなくApache + PHPをパッケージシステムでインストールするときに決めます。選択のために。あなたがのような他のウェブサーバーを使うつもりならnginxまたはlighttpdとにかく、PHPを埋め込むことはできません。あなたは使用を見ているでしょうFastCGIまたはPHPが全く異なる別のモデルで動作する同等のもの外側複数のPHPプロセスを持つWebサーバーのFastCGIそのような場合、スレッドセーフも重要ではありません。 Webサイトで使用されているバージョンを確認するには、次のファイルを含むファイルを入力します。<?php phpinfo(); ?>あなたのサイトでServer APIエントリ。これは次のように言うことができますCGI/FastCGIまたはApache 2.0 Handler

PHPのコマンドライン版も見れば、スレッドセーフは問題になりません。

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


  • PHP-FPMはスレッド化されていませんか? Fast CGIがnginxサーバーで使用されているため、これで問題は解決します。 - Xeoncross
  • 非常に詳細なことに、私は何年も前からPHPでプログラミングしてきましたが、これを知りませんでした。 - pthurmond
  • @Xeoncross:一般的にこれは正しいことであり、実際にはApacheの外部でPHPプロセスを管理する大きな理由の1つです。私は私の答えの中でこの側面について調べます。 - J. M. Becker
  • PHPのスレッドセーフは依然として「非常に論争されている」のでしょうか。 (2014年に)? - sam
  • PHPのスレッドセーフは依然として「非常に論争されている」のでしょうか。 (2015年とバージョン7)? - Altiano Gerung

241

私のために、私はいつもノンスレッドセーフを選びますなぜなら私はいつもnginxを使っているか、あるいはコマンドラインからPHPを実行しているからです。

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

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


  • "ワーカーがMPMであるApacheモジュールとしてPHPをインストールする場合は、スレッドセーフバージョンを使用する必要があります。 - wlf
  • スレッドセーフはZTSと同じですか? - CMCDragonkai
  • だから、Windows上でxamppに付属していることNTSまたはTSのPHPですか? - Abudayah
  • PHPの内蔵Webサーバーを使用している場合はどうなりますか?最適なパフォーマンスを得るために使用するPHPのバリエーションはどれですか? - Dario
  • @ダリオ私はWindowsだと思います。 - Greg

28

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

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

Linux

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

PHP-FPM + APC

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


19

に従ってPHPドキュメント

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

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

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

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

  • SNMP(UNIX)
  • mSQL(UNIX)
  • IMAP(Win / Unix)
  • Sybase-CT(Linux、libc5)

リンクされた質問


関連する質問

最近の質問