2009-08-26 19 views
1

私の理解では、PHPのp *接続はサービスへのページ読み込み(memcacheやソケットなど)間の接続を永続的に保つということです。しかし、これらの接続はスレッドセーフですか? 2つのページが同じ接続に同時にアクセスしようとするとどうなりますか?PHPのp *接続メソッドはどのように機能しますか?

+1

私は誰かがあなた自身でこれをテストできると言っているものを賭けます。ああ見て..私はやった。 :P –

答えて

11

一般的なUNIX展開では、PHPがインストールされていますapache Webサーバーの内部で実行されるモジュールとして、HTTP要求を複数の生成された子のうちの1つにディスパッチするように構成されています。

効率を上げるために、apacheは事前にこれらのプロセスを事前に作成して保守するため、複数のリクエストをディスパッチできるようにし、すべてのプロセスを起動するオーバーヘッドを削減します。

PHPはすべてのリクエストをクリーンな環境で開始するという原則に基づいて動作します。ページ変数の間にはスクリプト変数は存在しません。 (これはmod_perlやpythonと対照的ですが、予期せぬ状態のハングオーバーによる微妙なバグが頻繁に現れます)。

これは、GDまたはデータベース接続のイメージハンドルであるPHPスクリプトによって割り当てられた一般的なリソースが、リクエストの最後に解放されることを意味します。

いくつかのリソース(特にOracleデータベース接続)は、確立するにはかなりのコストがかかります。そのため、ディスパッチされたWebリクエスト間にその接続をキャッシュしておくことが望ましいです。

永続リソースを入力してください。

これらの仕組みは、特定のApacheの子プロセスがリソースの「永続的なリスト」に登録することで、要求の範囲を超えてリソースを維持する可能性があることです。永続リストは、要求の最後にクリーンアップされません(内部でRSHUTDOWNとして知られています)。 pconnect関数を使用すると、固有の資格情報のセットに対する永続リストエントリを検索し、存在する場合はそれを返します。または、それらの資格情報との新しい接続を確立します。

200個の子プロセスを維持するようにApacheを設定している場合は、Webサーバーからデータベースマシンに多くの接続が確立されていることが予想されます。

多くのWebサーバーと1台のデータベースマシンがある場合は、データベースマシンの読み込みを予想よりもずっと終了させることができます。

スレッドSAPIを使用すると、スレッドごとに永続的なリストが維持されるため、スレッドセーフでなければならず、同様の利点がありますが、PHPについての通常の警告はスレッド化されたSAPIで実行することは推奨されません安全であるため、それが使用するライブラリの多くは、スレッドの安全上の問題を抱えており、頭痛の原因になります。

+0

男は答えの質を説明するPHPのコア開発者です... –

0

一般に、PHPスクリプトが永続的な接続を要求すると、PHPは同じ接続パラメータで接続プール内のものを探します。

使用されていないものが見つかった場合は、スクリプトに与えられ、スクリプトの最後にプールに戻されます。

+0

いつもスレッド版を使用しているWindows上でPHPを実行するとどうなりますか? UNIX上でApachesワーカーMPM、btwと同じです。 –

0

このマニュアルのページPersistent Database Connectionsでは、永続的な接続に関する2つの情報が得られる場合があります。

まだスレッドの安全性については何も言及していません。私はどこでも、私が覚えている限り、それについて何も見たことがないので、それは "うまくいく"と思う。私の推測では、接続は別のスレッドで同時に使用されていない場合に限り再利用されますが、(論理的な)野生の推測のようなものです...

0

一般に、PHPはWebサーバー上で実行中のプロセスまたはスレッドごとに1つの永続的な接続を行います。このため、プロセスまたはスレッドは、別のプロセスまたはスレッドの接続にアクセスしません。

代わりに、データベース接続を確立すると、PHPはすでに(ページリクエストを処理しているプロセスまたはスレッド内に)開いているかどうかをチェックし、そうであればそれを使用します。そうでなければ、新しいもの。

あなたの質問に答えるには、必ずしもスレッドセーフではありませんが、その動作のために2つのスレッドまたはプロセスが同じ接続にアクセスする状況はありません。

関連する問題