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


773

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

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

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


18
あなたは上のスレッドの安全性について読むことができますen.wikipedia.org/wiki/Thread_safety:PHPについてであるPHPスレッドセーフな PHPですが、スレッドセーフではないけれども:嘘を信じていないが 、PHPのスレッドセーフと非スレッドセーフbinarie違いあり十分なリソースが利用可能です。StackoverflowまたはGoogleで検索してください。
TigerTiger

回答:


668

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

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

他の完全に異なる同時実行モデル(非同期ソケットと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がそのワーカーMPMを使用して(つまり、スレッドを使用して)並行性を処理する場合、PHPはこの同じマルチスレッド環境内で動作できる必要があります-つまり、PHPはApacheで正しくボールをプレーできるように、スレッドセーフである必要があります!

この時点で、「OK、つまりマルチスレッドWebサーバーを使用していて、それにPHPを直接埋め込む場合は、スレッドセーフバージョンのPHPを使用する必要がある」と考える必要があります。そして、これは正しい考えでしょう。ただし、実際には、PHPのスレッドセーフ性については異論があります。それは、あなたが実際に何をしているのかを知るための根拠です。

最終メモ

あなたは不思議に思っている場合は、私の個人的なアドバイスをすることですありません、マルチスレッド環境でPHPを使用ことです。

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

PHPのコマンドラインバージョンも確認すると、スレッドの安全性は問題になりません。

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


2
PHP-FPMはスレッド化されていませんか?Fast CGIはnginxサーバーで使用されているため、これで問題が解決します。
Xeoncross、2011年

41
細かいこと、私は何年もPHPでプログラミングをしていて、これを知らなかった。
Patrick

1
@Xeoncross:一般にそれは正しいことであり、実際には、Apacheの外部でPHPプロセスを管理する大きな理由の1つです。私は私の答えでこの側面について説明します。
JMベッカー

ここでの唯一の問題は、PHP-FPMがWindowsでは使用できないことです。少なくともネイティブビルドとして。
Denis V

9
PHPのスレッドセーフティはまだ「非常に論争中」ですか(2015年とバージョン7)。
Altiano Gerung

261

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

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

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


1
「ワーカーをMPMとするApacheモジュールとしてPHPをインストールする場合は、スレッドセーフバージョンを使用する必要があります」
wlf

9
Windowsでxamppが付属しているphpはNTSまたはTSですか?
アブダヤ2014年

1
PHPの組み込みWebサーバーを使用している場合はどうなりますか?最適なパフォーマンスのために使用するPHPのバリアントはどれですか?
Ariod 2015年

1
@ダリオそれは単なるWindowsだと思います。
グレッグ

1
@ChristopherShawおい、答えは意見だけが含まれています。Apacheモジュールと組み合わせてZTSを使用する理由や理由はありません。その有効な答えではありません。217 pplでもm8は間違っている可能性があります。
ダニエルW.

30

構成/インストールが簡単なため、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プロセスマネージャーです。


21

PHPのドキュメントに従って、

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

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

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

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

  • SNMP(UNIX)
  • mSQL(UNIX)
  • IMAP(Win / Unix)
  • Sybase-CT(Linux、libc5)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.