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