Php 完全删除消息队列
我在PHP中有一个消息队列,我用它来处理任务,我在插入任务时引起了一个bug,它刚刚插入了一堆bool(我通常通过它传递对象) 我终止了读取队列的进程,因为它由于未删除项而挂起 我的典型代码已经运行了很长一段时间,它是:Php 完全删除消息队列,php,queue,posix,Php,Queue,Posix,我在PHP中有一个消息队列,我用它来处理任务,我在插入任务时引起了一个bug,它刚刚插入了一堆bool(我通常通过它传递对象) 我终止了读取队列的进程,因为它由于未删除项而挂起 我的典型代码已经运行了很长一段时间,它是: $mqst = msg_stat_queue($mqh); while ($mqst['msg_qnum']) { output('Queue is populated', O_DEBUG); msg_receive($mqh,
$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个“是”,这导致
msg\u receive
返回错误。因此,消息永远不会从队列中删除,因此它将保持不变
在下次调用该函数时,它将尝试获取相同的条目,因此它将再次失败
我最初的建议是将msg_receive
函数设置为while循环的条件,这一点马上就清楚了。(如果这确实是解决方案)
解决方案:现在,将
MSG_NOERROR
标志添加到MSG_receive
函数,看看下一条消息是否确实太大,然后从那里进行调试。$i——返回先前的$i值(然后递减),因此,当它为0时,它将被强制转换为false和stopnop,它不会返回$i的值,它只会说:“好的,完成了,下一步是什么?”编辑:对不起,误解了你的意思:是的,它会。但是,在我安装的0上,while似乎没有中断。请阅读手册。顺便说一句,我没有看到while($I--)在CodeNowUpdated帖子中。谢谢并且:它在终端运行的代码中。很抱歉,这不是问题所在-当调用msg_receive时,应该从队列中删除项目,而不是。没有逻辑错误。