在调试模式下调用了 N() 记录出列次数N_think_queue_out_times,
但N()函数也是用缓存来记录数据的,
N() ==> S() ==> $cache->set() ==> $this->queue()
这样经过一串调用后,又回到了 query() 函数,
于是N_think_queue_out_times入列,并挤出最前一个,
再次用N()对出N_think_queue_out_times加1,然后转一圈再回到query(),
本来按正常情况 N_think_queue_out_times 已经在队列中,不会再进行入列出列操作,
但上次N_think_queue_out_times入列后,还没执行最后的
return $fun[1]($queue_name,$value);
保存队列,就进入N()里循环了,导致每次检查队列都没有N_think_queue_out_times,
于是再次入列、出列、N()计数加1、再回来、……
调用死循环了,最终导致:
:(
Maximum function nesting level of '100' reached, aborting!
最初是在我用的3.1版发现的,找到原因后,看到有3.2.3的出来了,
但是下载下来发现同样的问题存在
修改方案:
if(count($value) > $this->options['length']) {
// 出列
$rm_key = array_shift($value);
// 删除缓存
$this->rm($rm_key);
}
$ret = $fun[1]($queue_name,$value); // 先保存
if(APP_DEUBG && isset($rm_key)){
//调试模式下,记录出列次数
N($queue_name.'_out_times',1,true);
}
return $ret;
最佳答案