BUG: 调试模式下Cache类的调用死循环问题

浏览:622 发布日期:2015/01/30 分类:技术分享
在函数 queue() 中检查队列长度并做出列处理时,
在调试模式下调用了 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;
最佳答案
评论() 相关
后面还有条评论,点击查看>>