swoole程序間通訊之訊息佇列
阿新 • • 發佈:2019-02-12
1. 相關函式
2. 與訊息佇列相關的核心引數
1. 引數
- kernel.msgmnb = 4203520,訊息佇列的最大位元組數
- kernel.msgmni = 64,最多允許建立多少個訊息佇列
- kernel.msgmax = 8192,訊息佇列單條資料最大的長度
2. 修改方法
2.1 臨時修改
命令列執行如下命令
sysctl -w kernel.msgmax=1024
將msgmax改為1024,其它兩個引數修改方法類似
2.2 持久修改
修改/etc/sysctl.conf檔案,增加(修改)配置
kernel.msgmnb = 65536
kernel.msgmax = 8192
執行如下命令使配置生效
/sbin/sysctl -p
3.幾點說明
3.1單條訊息超過kernel.msgmax的情況
此時push()返回false,php會報類似下面的錯誤
PHP Warning: swoole_process::push(): msgsnd() failed. Error: Invalid argument[22]
3.2訊息總量超過kernel.msgmnb的情況
- 預設模式下(阻塞模式)時,push方法會阻塞等待。
- 非阻塞模式下,push方法會立即返回false。
注意,這裡說的是佇列總體大小,如果你的機器上有多個佇列,總體大小是指所有佇列所佔空間的總和。
3.3如何在程序重啟後延用之前的佇列
- 程序啟動後使用ipcs -q檢視佇列的key
ipcs -q
------ Message Queues --------
key msqid owner perms used-bytes messages
0x0010e9e7 360448 ballqiu 666 1832 2
- 重啟前修改程式碼,將useQueue()的第一個引數填寫上面的key值。
$process = new swoole_process('callback_function' , false, false);
$process->useQueue(0x0010e9e7);
這樣,即使程序重啟,依然可以延用之前的佇列,佇列中若有未處理完的資料可以繼續通過pop()取得。