System V 訊息佇列提供進程間非同步通訊機制,適用於 Linux 環境。PHP 透過 msg_* 系列函式操作佇列。
$key = ftok(__DIR__, 'R'); // 產生鍵值
$q = msg_get_queue($key); // 取得/建立佇列
// 發送訊息
for ($i = 0; $i < 100; $i++) {
$flag = msg_send($q, 111, ['a' => 1], true, false, $errorcode);
var_dump($errorcode);
}
// 接收訊息
$data = msg_receive($q, 0, $type, 200, $msg);
var_dump($data, $type, $msg);
// 移除佇列
msg_remove_queue($q);
msg_send:$msgtype 為訊息類型(大於 0),$serialize 預設序列化,$blocking 控制佇列滿時是否阻塞。msg_receive:$desiredmsgtype=0 表示取隊首訊息,$maxsize 限制最大長度,$flags 可設 MSG_IPC_NOWAIT 非阻塞模式。$status = msg_stat_queue($q);
print_r($status);
/* 輸出範例:
Array (
[msg_perm.uid] => 1015
[msg_perm.gid] => 100
[msg_perm.mode] => 438
[msg_stime] => 0
[msg_rtime] => 0
[msg_ctime] => 1411830331
[msg_qnum] => 0
[msg_qbytes] => 65536
[msg_lspid] => 0
[msg_lrpid] => 0
) */
Linux 下可用 ipcs -q 查看佇列,ipcrm -q <msqid> 刪除。
msg_qbytes),需依負載調整核心參數。msg_send 的 $errorcode,避免阻塞導致進程卡死。