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函数的参数逻辑进行整理,尤其是第三个参数为数组时的逻辑,并且在手册上写清楚 