説明する
1. メッセージ キューはメモリに格納されるキューです。
2. メッセージ キュー内のデータにアクセスできるプロセスは 1 つだけであるため、追加のロックやセマフォは必要ありません。
例
echo "親の進行状況 pid:{$parentPid}n";$childList = array(); // メッセージ キューを作成し、メッセージ タイプを定義します (データベースのライブラリと同様) $id = ftok(__FILE__,'m'); $msgQueue = msg_get_queue($id); const MSG_TYPE = 1; // プロデューサー関数プロデューサー(){ グローバル $msgQueue; $pid = posix_getpid(); $repeatNum = 5; for ( $i = 1; $i <= $repeatNum; $i++) { $str = "({$pid})作成進行状況! {$i}"; msg_send($msgQueue,MSG_TYPE,$str); $rand = rand(1,3); スリープ($rand); } } //コンシューマ関数consumer(){ グローバル $msgQueue; $pid = posix_getpid(); $repeatNum = 6; for ( $i = 1; $i <= $repeatNum; $i++) { $rel = msg_receive($msgQueue,MSG_TYPE,$msgType,1024,$message); echo "{$message} | Consumer({$pid}) destroy n"; $rand = rand(1,3); スリープ($rand); } } 関数 createProgress($callback){ $pid = pcntl_fork(); if ( $pid == -1) { //作成に失敗しました exit("フォーク進行エラー!n"); else if ($pid == 0) { // サブプロセス実行プログラム $pid = posix_getpid(); $callback(); exit("({$pid})子の進行状況は終了です!n"); }それ以外{ //親プロセスはプログラムを実行します return $pid; } } // 3回の書き込み処理 for ($i = 0; $i < 3; $i ++ ) { $pid = createProgress('プロデューサー'); $childList[$pid] = 1; echo "プロデューサーの子の作成の進行状況: {$pid} n"; } // 2回の書き込み処理 for ($i = 0; $i < 2; $i ++ ) { $pid = createProgress('consumer'); $childList[$pid] = 1; echo "コンシューマの子の作成の進行状況: {$pid} n"; } // すべての子プロセスが終了するまで待機します while(!empty($childList)){ $childPid = pcntl_wait($status); if ($childPid > 0){ unset($childList[$childPid]); } } echo "({$parentPid})メインの進行状況は終了です!n";
以上が PHP メッセージキューの紹介でしたので、皆様のお役に立てれば幸いです。