本文另外刊登于我的部落格: Hankz Blog
一、前言
在写CI的时候是否曾经遇过out of memory的错误呢
CodeIgniter作为轻量化的PHP框架
db物件一直是操作资料库的好帮手
简化了下达sql指令时的操作
加快了开发的速度
但其实看似好用的工具里说不定有着隐藏的问题
二、正文
$this->db
作为一个操作资料库的物件
有两个官方文档中几乎没有提到的参数:$this->db->queries
与 $this->db->query_times
这个功能其实是CodeIgniter提供给开发者查询sql指令纪录与执行时间的功能
可以看到每个sql语法花费的实际时间
直接看Code:
$times = $this->db->query_times;foreach ($this->db->queries as $key => $query){ $microsec = round($times[$key] * 1000, 4); echo '[' . $microsec . ' microseconds] ' . $query . '<br>';}
执行结果:
从执行结果可以清楚的了解每个sql语法花费了多久的时间进行查询
帮助开发人员进行效能优化
执行的所有语法都存在这个变数里面,真是太方便了对吧~
但是
这个功能在CodeIgniter里是预设开启的
所以当今天需要进行大量的sql查询时
这个功能就会默默地吃掉记忆体
甚至导致out of memory错误
如果没有特别需要的话
可以在资料库设定加上 'save_queries' => FALSE
如下:
$db['default'] = array('dsn'=> '','hostname' => '','username' => '','password' => '','database' => '','dbdriver' => 'mysqli','dbprefix' => '','pconnect' => FALSE,'db_debug' => (ENVIRONMENT !== 'production'),'cache_on' => FALSE,'cachedir' => '','char_set' => 'utf8','dbcollat' => 'utf8_general_ci','swap_pre' => '','encrypt' => FALSE,'compress' => FALSE,'stricton' => FALSE,'failover' => array(),'save_queries' => FALSE,'port' => 3306,);
或是在执行大量查询前
先使用:
$this->db->save_queries = FALSE;
来避免log纪录吃掉大量记忆体的状况
三、结语
我们都知道使用框架非常方便
可以省去很多重複的动作
以CodeIgniter中的db物件来说
最大的帮助就是减少了每次都要防範SQL injection功夫
还有串接SQL语法的麻烦
但是框架最大的隐患就是
使用它提供的「方便」
但却不知道框架到底在背后做了什么事情
我们需要思考一个问题:
你在使用这些方便的工具生成SQL语法时
真的知道它实际上执行的SQL语句长甚么样子吗?
会不会程式效率很差的原因就出在框架?
这篇并不是鼓励不要使用框架
而是想分享一个观念:不要过度依赖任何工具
真的清楚自己做了甚么事情
才不会哪一天被自己给坑了
环境
CodeIgniter 3