【问题标题】:Removing a message queue completely完全删除消息队列
【发布时间】:2012-08-18 21:36:47
【问题描述】:

我在 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() 销毁队列指定的消息队列。仅当所有进程都处理完消息队列并需要释放它所占用的系统资源时才使用此功能。

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

【问题讨论】:

    标签: php queue posix


    【解决方案1】:

    编辑这个答案是错误的。

    仔细研究问题后,我认为问题出在:队列中的第一条消息大于2048个字节,导致msg_receive返回错误。因此,消息永远不会从队列中删除,所以它会保持原样。

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

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

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

    【讨论】:

    • $i-- 返回 $i 的前一个值(然后递减) 所以,当它为 0 时,它将被强制转换为 false 并停止
    • 不,它不会返回 $i 的值,它只会说:“好的,完成了,下一步是什么?”编辑:对不起,误解了你的意思:是的。但是,在我的安装中,while 似乎没有中断 0。
    • 阅读手册。顺便说一句,我现在在代码中看不到 while($i--)
    • 更新帖子。谢谢。并且:它在终端中运行的代码中。
    • 对不起,但这不是问题 - 当调用 msg_receive 时,项目应该从队列中删除,但不是。没有逻辑错误。
    猜你喜欢
    • 2015-10-18
    • 1970-01-01
    • 2021-04-20
    • 2016-01-20
    • 2014-06-07
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多