ホームページ > php教程 > php手册 > PHPでプロセス間通信を完了するためにLinuxメッセージキューを操作する方法

PHPでプロセス間通信を完了するためにLinuxメッセージキューを操作する方法

WBOY
リリース: 2016-06-13 12:14:34
オリジナル
1082 人が閲覧しました

Linux システムにおけるプロセス通信の概念と実装については、 http://www.ibm.com/developerworks/cn/linux/l-ipc/ を参照してください。
Linux システムにおけるメッセージ キューの概念と実装については、 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, 0666);
$message_queue_status = msg_stat_queue($message_queue); print_r( $message_queue_status);
//メッセージ キューに書き込みます
msg_send($message_queue, 1, "Hello, World!");
$message_queue_status = msg_stat_queue($message_queue); ($ message_queue_status);
//メッセージキューから読み取ります
msg_receive($message_queue, 0, $message_type, 1024, $message, true, MSG_IPC_NOWAIT);
print_r($message."rn"); ;
msg_remove_queue($message_queue);


このコードの実行結果は次のとおりです:


コードをコピーします。 🎜>
コードは次のとおりです:

resource(4) タイプ (sysvmsg queue) Array (

[msg_perm.uid] => 1000)

[msg_perm.gid ] => 1000
[msg_perm.mode] => 438
[msg_stime] => 0
[msg_rtime] => 0
[msg_ctime] => [msg_qnum] ] => 0
[msg_qbytes] => 16384
[msg_lspid] => 0
[msg_lrpid] => 0
)
配列
(
[msg_perm.uid] ] => 1000
[msg_perm.gid] => 1000
[msg_perm.mode] => 438
[msg_stime] => 1279849495
[msg_rtime ] => 0
[msg_ctime] => 1279849495
[msg_qnum] => 1
[msg_qbytes] => 16384
[msg_lspid] => ] => 0
)
こんにちは


「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(); 🎜>for ($i = 0; $i //子プロセスを作成します
$pids[$i] = pcntl_fork();
if ($pids[$ i]) {
echo "No.$i 子プロセスが作成されました。pid は $pids[$i]rn";
} elseif ($pids[$i] == 0) {
$pid = posix_getpid();
echo "process.$pid が書き込み中";
msg_send($message_queue, 1, "これは process.$pid のデータです"); SIGTERM);
}
}
do {
msg_receive($message_queue, 0, $message_type, 1024, $message, true, MSG_IPC_NOWAIT); /キューが空かどうかを判断する必要があります。空の場合は
を終了します。 while(true)
?>


実行結果は次のとおりです。 :


コードをコピー

コードは次のとおりです:

No.0 の子プロセスが作成されました。pid は 5249 1番の子プロセスが作成されました、pidは5250 2番の子プロセスが作成されました、pidは5251

3番の子プロセスが作成されました、pidは5252

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 がプロセス間通信にシグナルやソケットなどをどのように使用するかを学習していきます。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート