
説明する
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 メッセージキューの紹介でしたので、皆様のお役に立てれば幸いです。