http://www.php.net/manual/en/intro.shmop.phpshmop PHP拡張機能は何をしますか?
SHMOPはPHPは、UNIXは、共有メモリ・セグメントを、 読み書き作成および削除することを可能にする機能のセットを使用して容易です。
この拡張機能の目的は何ですか?それは何のために使われますか?
http://www.php.net/manual/en/intro.shmop.phpshmop PHP拡張機能は何をしますか?
SHMOPはPHPは、UNIXは、共有メモリ・セグメントを、 読み書き作成および削除することを可能にする機能のセットを使用して容易です。
この拡張機能の目的は何ですか?それは何のために使われますか?
共有メモリでは、複数のプロセスがメモリ内の同じデータにアクセスできます。実行中の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
)、メッセージパッシングの限られた種類。信号は非常に短時間で動作するため、スクリプトページでは特に役立ちません。posix_mkfifo
を使用してnamed pipes(別名FIFOs)を作成し、標準のfile関数を使用してデータを読み書きします。親と子のプロセスの間に、popen
またはproc_open
を使用して、無名(別名anonymous)のパイプを作成できます。名前のないパイプは、任意のプロセス間で作成することはできません。一部のシステムではパイプが一方向であることに注意してください。パイプハンドルは読み書きに使用できますが、両方では使用できません。shm_attach
)の両方を提供します。 SAM,STOMP、およびAMQPなど、さまざまなメッセージングプロトコルの他の多くの拡張も利用できます。他にも、PHPマニュアルの "Other Services"を参照してください。ソケット(およびストリームラッパーなどのそれらに基づくもの)とパイプは、プロセス間でデータを渡すために使用できますが、2つ以上のプロセスを持つ能力は限られています。ソケットは2つのプロセスのみを接続できます。 3つ以上を処理するには、複数のソケットを開く必要があります(これは、通常、クライアント/サーバーアーキテクチャがそこに入ります)。パイプでは、1つのプロセスのみが可能です。read given data;いったん取得すると、他のデータを読み取ることはできますが、そのデータは他の読者には利用できなくなります(リーダー以外のすべてのユーザーは利用できなくなります)。任意の数のプロセスが同じ共有メモリ領域を開くことができます。
実行中のプロセスがメモリを要求すると、システムは割り当てられたプロセスによってのみアクセス可能なメモリスライスを提供します。時々、複数のスレッドを実行し、それらの間でデータを共有したいことがあります。
「共有データ」によって行うことができます。データを渡すと、一部では非常に便利ではありませんので、ソケット/パイプ
経由
問題の機能は、PHPの共有メモリセグメントを処理する機能を提供します。
だから、基本的に役に立たないのですか?グローバル変数を使うことができれば、それらのshmop_ *関数を使いこなす必要はありません。 – Alex
@Alex:PHPにはそういうグローバル変数はありません。あなたは常にプロセス空間を分けているので、PHPではそれが間違っています。 - shmopはmemcacheによく似ていますが、PHPとCの間で共有するためのPOSIX/Unixシステム機能(ただし、バイナリ表現の不一致でない場合はその重複を見つけることができません)を除いて、実際、shmopは通常は '/ etc/shm/* 'にファイルエントリを作成します。 – mario
共有メモリはオペレーティングシステムによって管理されます。彼らは、グローバル変数の限られた使用と比較して、より多くの保護および制御サービスを提供します。共有メモリは、主にプロセス間通信に使用されます。これを明示的に必要としない場合は、変数に固執してください。 – fuzzy
受信プロセスをメッセージに反応させてイベント駆動型にする良い方法はありますか? – CMCDragonkai
@outis、Windowsと同等のものは何ですか? – Pacerier
これは複数のノードサーバーでどのように機能しますか? –