完全删除消息队列


Removing a message queue completely

我在PHP中有一个消息队列,用于处理任务,我在插入任务时引起了一个错误,它刚刚插入了一堆布尔值(我通常通过它传递对象)。

我杀死了读取队列的进程,因为它由于未删除项目而挂起。

我的典型代码在相当长的一段时间内运行良好是:

    $mqst = msg_stat_queue($mqh);
    while ($mqst['msg_qnum']) {
        output('Queue is populated', O_DEBUG);
        msg_receive($mqh, 0, $msgtype, 2048, $data, true);
        $mqst = msg_stat_queue($mqh);
        if ($data instanceof 'Core'Image) {
            $new_tasks[] = $data;
        } else {
            output('Got some odd data.. ' . print_r($data, true), O_ERROR);
        }
    }

从我的终端:

$ php -r '$mqh = msg_get_queue(12345, 0666);
          $mqst = msg_stat_queue($mqh); 
          $i = $mqst["msg_qnum"]; while ($i--) {
             msg_receive($mqh, 0, $type, 2048, $data, true);
             var_dump($type, $data); 
          }'

输出:

int(0)
bool(false)
int(0)
bool(false)
int(0)
bool(false)
int(0)
bool(false)
int(0)
bool(false)
int(0)
bool(false)
int(0)
bool(false)

我可以无限期地重复这一点,他们没有让步。我试图删除队列但没有成功,文档指出:

msg_remove_queue() 销毁队列指定的消息队列。仅当所有进程都完成了消息队列的工作,并且需要释放消息队列所持有的系统资源时,才使用此功能。

但是,我已经杀死了该过程,并且它对释放资源不是很具体。我不确定为什么收到消息后没有从队列中弹出。也许我错过了一些简单的东西

编辑 这个答案是错误的。

在更彻底地研究了这个问题之后,我认为问题如下:队列中的第一条消息大于 2048 byes,这会导致msg_receive返回错误。因此,消息永远不会从队列中删除,因此它将保持不变。

下次调用该函数时,它将尝试获取相同的条目,因此它将再次失败。

我最初的建议是将msg_receive函数作为 while 循环的条件,这会立即明确这一点。(如果它确实是解决方案)。

解决方案:现在,将 MSG_NOERROR 标志添加到 msg_receive 函数中,只是为了查看下一条消息是否确实太大,并从那里进行调试。