2011-12-25 25 views

答えて

31

共有メモリでは、複数のプロセスがメモリ内の同じデータにアクセスできます。実行中のPHPスクリプト間でデータを共有するために使用することができます。

$shm = shmop_open(0xF00, "c", 0644, 4); 

$count = unpack('L', shmop_read($shm, 0, 4)); 
$count = reset($count); 
var_dump($count); 
echo "count: ", $count++, "<br/>\n"; 
shmop_write($shm, pack('L', $count), 0); 

コンピュータが再起動すると、共有メモリ内のすべてのものが失われます。

異なるプロセスが同じ共有メモリに同時にアクセスできるため、race conditionsになる可能性があります。上記の例では、2つのプロセスがどちらか一方に書き戻す前に共有メモリを読み取ると、その数は1より少なくなります。競合状態は、mutexを使用することによって防止することができますが、それはこのQ &の範囲外です。

共有メモリは、1つのタイプのinter-process communication、つまりデータの受け渡しに使用されます。 (プラットフォームとPHPのビルドに応じて)PHPで利用可能ないくつかの他のものは以下のとおりです。

  • 信号(シグナルハンドラを設定するための信号、pcntl_signalを送信するためにposix_kill)、メッセージパッシングの限られた種類。信号は非常に短時間で動作するため、スクリプトページでは特に役立ちません。
  • Socketsデータです。ソケットはネットワークを使用することも、ローカルにすることもできます。
  • データ用のパイプ。 posix_mkfifoを使用してnamed pipes(別名FIFOs)を作成し、標準のfile関数を使用してデータを読み書きします。親と子のプロセスの間に、popenまたはproc_openを使用して、無名(別名anonymous)のパイプを作成できます。名前のないパイプは、任意のプロセス間で作成することはできません。一部のシステムではパイプが一方向であることに注意してください。パイプハンドルは読み書きに使用できますが、両方では使用できません。
  • Semaphoressynchronization
  • messagingのメッセージキュー。 PHPでは、Semaphore拡張モジュールはメッセージキューと共有メモリ関数の別のセット(例えばshm_attach)の両方を提供します。 SAM,STOMP、およびAMQPなど、さまざまなメッセージングプロトコルの他の多くの拡張も利用できます。他にも、PHPマニュアルの "Other Services"を参照してください。
  • ネットワークstream wrappers下位レベルでは、これらはソケットですが、異なるインターフェースを提供します。特定のアプリケーションレベルのプロトコルにも対応していますが、ソケットはより一般的です。
  • Network protocol extensionsなど、cURLのようなメッセージ&データ用です。ストリームラッパーのように、これらは変装した(制限された)ソケットです。
  • Web service extensions例えば、SOAPおよびXML-RPCremote procedure calls(RPC)など。これらはソケットをベースにしていますが、IPC(データではなくRPC)の異なるタイプのものです。

ソケット(およびストリームラッパーなどのそれらに基づくもの)とパイプは、プロセス間でデータを渡すために使用できますが、2つ以上のプロセスを持つ能力は限られています。ソケットは2つのプロセスのみを接続できます。 3つ以上を処理するには、複数のソケットを開く必要があります(これは、通常、クライアント/サーバーアーキテクチャがそこに入ります)。パイプでは、1つのプロセスのみが可能です。read given data;いったん取得すると、他のデータを読み取ることはできますが、そのデータは他の読者には利用できなくなります(リーダー以外のすべてのユーザーは利用できなくなります)。任意の数のプロセスが同じ共有メモリ領域を開くことができます。

+0

受信プロセスをメッセージに反応させてイベント駆動型にする良い方法はありますか? – CMCDragonkai

+0

@outis、Windowsと同等のものは何ですか? – Pacerier

+0

これは複数のノードサーバーでどのように機能しますか? –

9

実行中のプロセスがメモリを要求すると、システムは割り当てられたプロセスによってのみアクセス可能なメモリスライスを提供します。時々、複数のスレッドを実行し、それらの間でデータを共有したいことがあります。

「共有データ」によって行うことができます。データを渡すと、一部では非常に便利ではありませんので、ソケット/パイプ

  • 共有メモリ(スレッド、プロセス)
  • 経由

    • 渡すデータ場合によっては、Shared memoryを使用することもできます。

      問題の機能は、PHPの共有メモリセグメントを処理する機能を提供します。

    +0

    だから、基本的に役に立たないのですか?グローバル変数を使うことができれば、それらのshmop_ *関数を使いこなす必要はありません。 – Alex

    +2

    @Alex:PHPにはそういうグローバル変数はありません。あなたは常にプロセス空間を分けているので、PHPではそれが間違っています。 - shmopはmemcacheによく似ていますが、PHPとCの間で共有するためのPOSIX/Unixシステム機能(ただし、バイナリ表現の不一致でない場合はその重複を見つけることができません)を除いて、実際、shmopは通常は '/ etc/shm/* 'にファイルエントリを作成します。 – mario

    +0

    共有メモリはオペレーティングシステムによって管理されます。彼らは、グローバル変数の限られた使用と比較して、より多くの保護および制御サービスを提供します。共有メモリは、主にプロセス間通信に使用されます。これを明示的に必要としない場合は、変数に固執してください。 – fuzzy

    関連する問題