Linux システムにおけるプロセス通信の概念と実装については、 http://www.ibm.com/developerworks/cn/linux/l-ipc/ をご覧ください
Linux システムのメッセージ キューの概念と実装については、こちらをご覧ください。 view: http://www .ibm.com/developerworks/cn/linux/l-ipc/part4/
PHP の sysvmsg モジュールは、Linux システムでサポートされる System V IPC の System V メッセージ キュー関数ファミリーをカプセル化したものです。プロセス間通信には sysvmsg モジュールが提供する関数を使用する必要があります。まずサンプル コード 1 を見てみましょう:
コードをコピーします コードは次のとおりです:
$message_queue_key = ftok(__FILE__, 'a');
$message_queue = msg_get_queue($) message_queue_key, 066 6 ;
$message_queue_status = msg_stat_queue($message_queue);
print_r($message_queue_status)
//メッセージキューから読み取る
msg_receive($message_queue, 0, $message_type, 1024, $message, true, MSG_IPC_NOWA) IT) ;
print_r($ message."rn");
msg_remove_queue($message_queue);
配列
(
[msg_perm.uid] => 1000
[msg_perm.gid] => 1000)
[msg_perm.mode] => 438
[msg_stime] => 0
[msg_ctime] => 0
[msg_qbytes] => t; 16384
[msg_lspid] => 0
[msg_lrpid] => 0
) 配列 ( [msg_perm.uid] => 1000 [msg_perm.gid] => 1000
[msg_perm.モード] => ; 438
[msg_stime] => 1279849495
[msg_ctime] => 1279849495
[msg_qbytes] => 16384
[msg_lspid] => 2184
[msg_lrpid] => 0
)
Hello,World!
メッセージキューから「Hello, World!」文字列を読み取ることができます
サンプルコードの主な関数は次のとおりです。 :
コードをコピーします
コードは次のとおりです:
ftok ( string $pathname , string $proj )
マニュアルの説明は次のとおりです: パス名とプロジェクト識別子を System V IPC に変換します鍵。この関数によって返されるキー値は、Linux システムのメッセージ キューに一意に対応します。この関数は、メッセージ キューへの参照を取得する前に呼び出す必要があります。
msg_get_queue ( int $key [, int $perms ] )
msg_get_queue() は、渡されたキー値に基づいてメッセージキューへの参照を返します。 Linux システムにキー値に対応するメッセージ キューがない場合、msg_get_queue() は新しいメッセージ キューを作成します。関数の 2 番目のパラメーターは、新しく作成されたメッセージ キューの許可値として int 値を渡す必要があります。デフォルトは 0666 です。 Linux システム内のすべてはファイルであるため、このアクセス許可の値は、Linux コマンド chmod で使用される値と同じ意味を持ちます。
msg_send ( resource $queue , int $msgtype ,mixed $message [, bool $serialize [, bool $blocking [, int &$errorcode ]]] )
その名前が示すように、この関数はメッセージにデータを書き込むために使用されます列。
msg_stat_queue ( resource $queue )
この関数はメッセージキューのメタデータを返します。メッセージ キュー メタデータ内の情報は、メッセージ キューで読み取られるメッセージの数、最後の読み取りおよび書き込みキューのプロセス ID などを含む、非常に完全な情報です。サンプル コードは 8 行目で関数を呼び出し、キュー内で読み取られるメッセージの数を返します。msg_qnum 値は 0 です。
msg_receive ( resource $queue , int $desiredmsgtype , int &$msgtype , int $maxsize ,mixed &$message [, bool $unserialize [, int $flags [, int &$errorcode ]]] )
msg_receive は読み取りに使用されますメッセージキュー内のデータ。
msg_remove_queue ( resource $queue )
msg_remove_queue はキューを破棄するために使用されます。
サンプル コード_1 は、PHP のメッセージ キュー関数のアプリケーションを示しています。次のコードは、プロセス間通信シナリオを具体的に説明しています
コードをコピーします コードは次のとおりです:
$message_queue_key = ftok(__FILE__, 'a');
$message_queue = msg_get_queue($message_queue_key, 0666);
$pids = array(); ; 5; $i++) {
//子プロセスを作成します
$pids[$i] = pcntl_fork();
if ($pids[$i]) {
echo "No.$i 子プロセスが作成されましたis $pids[$i]rn";
} elseif ($pids[$i] == 0) {
$pid = posix_getpid();
echo "process.$pid が書き込み中です";
msg_send($message_queue , 1, "これは process.$pid のデータです");
posix_kill($pid, SIGTERM)
}
}
do {
msg_receive($message_queue, 0, $message_type, 1024, $message, true, MSG_IPC_NOWAIT) ;
echo $message;
//キューが空かどうかを判断する必要があります。空の場合は終了します
} while(true)
実行結果は次のとおりです:
コードをコピー
コードは次のとおりです:
No.0の子プロセスが作成されました、pidは5249 No.1の子プロセスが作成されました、pidは5250 No.2の子プロセスが作成されました、pidはは5251です No.3の子プロセスが作成されました、pidは5252です
No.4の子プロセスが作成されました、pidは5253です
process.5251は現在書き込み中です
これはprocess.5251のデータです
process.5253は現在書き込み中です
process.5252 は現在書き込み中です
process.5250 は現在書き込み中です
これは process.5253 のデータです
これは process.5252 のデータです
これは process.5250 のデータです
process.5249 は現在書き込み中です
これは process.5249 のデータです
このプログラムの実行結果は毎回異なります。これは、マルチプロセスの非同期の性質を示しています。メッセージキューの FIFO 特性も結果からわかります。
上記は私の研究経験です。次に、PHP がプロセス間通信にシグナルやソケットなどをどのように使用するかを学習していきます。
http://www.bkjia.com/PHPjc/322208.html
www.bkjia.com
true
http://www.bkjia.com/PHPjc/322208.html技術記事 Linux システム・プロセス通信の概念と実装については、http://www.ibm.com/developerworks/cn/linux/l-ipc/ を参照してください。 Linux システム・メッセージ・キューの概念と実装については、http: //www...