数据缓存队列内存溢出

浏览:2070 发布日期:2014/07/29
3.2.2 - 严重 - 已处理
当数据缓存设置队列长度时会导致内存溢出:
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 130968 bytes) in /home/colin/Workspace/platform2/ThinkPHP/Common/functions.php on line 121

代码:        S(array('length' => 3));
        for ($i = 1; $i <= 5; $i++) {
            S('foo'.$i, $i);
        }
经测试为无限递归调用所导致的,在Cache.class.php的第112行:             if(APP_DEBUG){
                //调试模式下,记录出列次数
                N($queue_name.'_out_times',1,true);
            }
出列后N()会调用S()缓存出列次数,S()会继续调用queue出列已移除的元素,从而发生的递归调用的问题。


同时,在已经使用过S函数缓存Cache实例后,DB_SQL_BUILD_LENGTH和DB_SQL_BUILD_QUEUE配置无效。
因DB.class.php的第802行,S()函数无法使用第三个参数配置得到相应的Cache实例:S($key,$sql,array('expire'=>0,'length'=>C('DB_SQL_BUILD_LENGTH'),'queue'=>C('DB_SQL_BUILD_QUEUE')));建议对S函数的参数逻辑进行整理,尤其是第三个参数为数组时的逻辑,并且在手册上写清楚
评论(
后面还有条评论,点击查看>>