1. 程式人生 > >swoole程序間通訊之訊息佇列

swoole程序間通訊之訊息佇列

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如何在程序重啟後延用之前的佇列

  1. 程序啟動後使用ipcs -q檢視佇列的key
ipcs -q

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages    
0x0010e9e7 360448     ballqiu    666        1832         2
  1. 重啟前修改程式碼,將useQueue()的第一個引數填寫上面的key值。
$process = new swoole_process('callback_function'
, false, false); $process->useQueue(0x0010e9e7);

這樣,即使程序重啟,依然可以延用之前的佇列,佇列中若有未處理完的資料可以繼續通過pop()取得。