我在PHP中有一个用于处理任务的消息队列,我在插入任务时引起了一个错误,它刚刚插入了一堆bool(我通常会通过它传递对象)。
我杀死了读取队列的进程,因为它因未被删除的项目而挂起。
我的典型代码在很长一段时间内都运行良好:
$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()销毁队列指定的消息队列。只有当所有进程都使用了消息队列并且您需要释放它所拥有的系统资源时才使用此函数。
但是,我已经杀死了这个过程,并且它在释放资源方面并不是非常具体。我不确定为什么收到消息后消息不会从队列中弹出。也许我错过了一些简单的事情
答案 0 :(得分:-2)
编辑这个答案错了。
在更彻底地研究问题之后,我认为以下是问题:队列中的第一条消息大于2048个字节,这会导致msg_receive
返回错误。因此,消息永远不会从队列中删除,因此它将保持不变。
在接下来调用该函数时,它将尝试获取相同的条目,因此它将再次失败。
我的初步建议是使msg_receive
函数成为while循环的条件,立即明确了这一点。 (如果确实是解决方案)。
解决方案:现在,将MSG_NOERROR
标志添加到msg_receive
函数,只是为了查看下一条消息是否确实太大,并从那里进行调试。 / p>