摘要:接受不到消息消息隊列通過指定而被創(chuàng)建后,任意一方銷毀了該隊列,都會導(dǎo)致其他發(fā)送或接收方失敗。用法場景進程,中代碼段要用到中代碼段的結(jié)果。完成了進程間同步問題此外進程間通信采用的方式是共享內(nèi)存。
參考文章
深刻理解Linux進程間通信(IPC)
進程間通信(IPC)介紹
php高級應(yīng)用之進程控制及進程間通訊 workman 作者發(fā)布
PHP 相關(guān)進程間通信擴展-- System V IPC: sysvmsg 消息隊列 sysvsem 信號量 sysvshm 共享內(nèi)存 -- BSD IPC socket(stream) -- POSIX IPC posix 信號量 posix 共享內(nèi)存 posix 消息隊列sysvmsg(消息隊列)
php ftok 函數(shù)作用解析
php ftok 參數(shù)2坑!
用途:解決進程間通信問題
用法:發(fā)送方(send.php)
$key = 1; $msg = "發(fā)送方發(fā)送的消息"; $q = msg_get_queue($key); $send = msg_send($q , 1 , $msg , true , true); if ($send) { echo "消息發(fā)送成功" . PHP_EOL; } else { echo "消息發(fā)送失敗" . PHP_EOL; }
接收方(receive.php)
$key = 1; $q = msg_get_queue($key); /** * 第二個參數(shù)解釋: < 0 ,小于該絕對值的最小類型隊列上的第一條記錄 例如我設(shè)置了 -5,絕對值 5 該消息隊列的消息類型有 2 3 4 5 6 7 則返回類型為 2 的消息隊列上的第一條記錄 0 則獲取隊列第一條消息(不管消息類型,標(biāo)識符) 1 獲取設(shè)置類型下的第一條消息 第三個參數(shù)必須是個變量?。拥呢洠。? */ msg_receive($q , 1 , $msg_type , 1024 , $msg , true , MSG_NOERROR , $error_code);錯誤處理
無權(quán)限訪問
有可能你會碰到訪問無權(quán)限訪問隊列的情況。那是因為你的代碼長這樣。我也忘了是怎樣修復(fù)的,后面自動好了。
接受不到消息
消息隊列通過指定 key 而被創(chuàng)建后,任意一方銷毀了該隊列,都會導(dǎo)致其他發(fā)送 或 接收方失敗。
信號量(sysvsem) + 共享內(nèi)存(sysvshm) 用途:注意了:解決進程間同步問題。
用法場景:進程 A 、B、C,B 中代碼段 y 要用到 A 中代碼段 x 的結(jié)果。C 中代碼段 m 要用到 B 中代碼段 y 的結(jié)果。
$key = ftok(__FILE__ , 1); $shm = shm_attach($key); create(3 , [ // 進程 A function($index) use($key , $shm){ $sem_id = sem_get($key); // 獲取信號量?。ㄆ渌嗤@取該信號量的進程等待,直到該信號量被釋放為止) sem_acquire($sem_id); // x 處理語句 shm_put_var($shm , 1 , 10); $wait = 3; $count = 1; while ($count >= $wait) { echo "進程 A 等待處理" . $count++ . "s" . PHP_EOL; sleep(1); } // 3s 后釋放信號量 sem_release($shm); } , // 進程 B function($index) use($key , $shm){ $sem_id = sem_get($key); // 獲取信號量?。ㄆ渌嗤@取該信號量的進程等待,直到該信號量被釋放為止) sem_acquire($sem_id); // x 處理語句返回結(jié)果 $x = shm_get_var($shm , 1); $y = $x + 11; shm_put_var($shm , 2 , $y); $wait = 5; $count = 1; while ($count >= $wait) { echo "進程 B 等待處理" . $count++ . "s" . PHP_EOL; sleep(1); } // 5s 后釋放信號量 sem_release($shm); } , // 進程 C function($index) use($key , $shm){ $sem_id = sem_get($key); // 獲取信號量!(其他相同獲取該信號量的進程等待,直到該信號量被釋放為止) sem_acquire($sem_id); // x 處理語句返回結(jié)果 $y = shm_get_var($shm , 2); $c = $x + 12; echo "獲取到結(jié)果:" . $c; // 刪除共享內(nèi)存段 sem_remove($shm); } , ];
解釋:A 首先獲取到信號量,然后等待 3s 后釋放,期間 B、C在調(diào)用 sem_acquire 后阻塞,直到獲取到該信號量為止。A 釋放信號量后,B 現(xiàn)獲取,然后阻塞 5s 釋放,最后 C 獲取,執(zhí)行。完成了進程間同步問題!此外進程間通信采用的方式是共享內(nèi)存。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/30646.html
閱讀 2999·2021-11-23 09:51
閱讀 2820·2021-11-11 16:55
閱讀 2935·2021-10-14 09:43
閱讀 1403·2021-09-23 11:22
閱讀 1045·2019-08-30 11:04
閱讀 1674·2019-08-29 11:10
閱讀 970·2019-08-27 10:56
閱讀 3125·2019-08-26 12:01