我叫小井 发表于 2014-1-6 19:06:28

CI CLI 占用内存过大问题

本帖最后由 我叫小井 于 2014-1-6 19:10 编辑

有一个解析windows崩溃文件dmp的项目一直在跑,用的ci写的,突然有一天发现内存耗尽,崩了……{:soso_e136:}

后来细查发现CI的db类,存有一个 queries 成员变量,保存了以往所有查询过的语句,所有的,嗯,还有 query_times。

这两个变量应该是开发时做调试用的吧,但是没有在配置文件中给出配置选项,设置是否保存。也没有因为更改index.php的ENVIRONMENT 值为 production而取消保存。

db的内部倒是有一个变量来判断是否保存,叫 :
   51:         var $save_queries      = TRUE;
但是从最开始给TRUE后就没有改变过了,所以是一直保存,一直保存,直到内存耗尽,机器down掉,世界毁灭,宇宙坍缩~~

这个比较坑,大家写CLI要注意一下,另外不知道还有没有除了DB其他类有类似问题,贴出来就当抛个砖了~~
\system\database\DB_driver.php:
   49          var $query_count      = 0;
   50          var $bind_marker      = '?';
   51:         var $save_queries      = TRUE;
   52          var $queries                = array();
   53          var $query_times      = array();
   ..
288
289                  // Save thequery for debugging
290:               if ($this->save_queries == TRUE)
291                  {
292                        $this->queries[] = $sql;
...
299                  if (FALSE === ($this->result_id = $this->simple_query($sql)))
300                  {
301:                         if ($this->save_queries == TRUE)
302                        {
303                                  $this->query_times[] = 0;
...
338                  $this->benchmark += ($em + $es) - ($sm + $ss);
339
340:               if ($this->save_queries == TRUE)
341                  {
342                        $this->query_times[] = ($em + $es) - ($sm + $ss);

4 matches in 1 file

解决方法是自己清空那两个数组,或者修改system代码~~



magicone 发表于 2014-6-21 15:50:53

可以在使用时

$this->db->save_queries = FALSE;
页: [1]
查看完整版本: CI CLI 占用内存过大问题