[CodeIgniter 3] 记忆体的隐形杀手:Log all queries

前言

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>';
}

执行结果:
https://ithelp.ithome.com.tw/upload/images/20210917/20139878LzO8sMXawj.png

从执行结果可以清楚的了解每个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语句长甚麽样子吗?
会不会程序效率很差的原因就出在框架?

这篇并不是鼓励大家不使用框架
而是想告诉大家:不要过度依赖任何工具
真的清楚你做了甚麽事情
才不会哪一天被自己给坑了


<<:  Day22:安全性和演算法-公开金钥密码系统(Public-key Cryptosystem)

>>:  Day22:[排序演算法]Merge sort - 合并排序法

Day.19 认识索引 - 二级索引 (Secondary Index)

InnoDB将索引分成Cluster Index & Secondary Index,认识...

Day 29 使用 docker-compose 来安装 Wordpress

使用 docker 安装 Wordpress 这个相当热门的 CMP 内容管理平台,可以省去不少过往...

30-9 之Presentation Layer - MVP ( Model-View-Presenter )

接下来我们来谈谈 MVP ( Model-View-Presenter ),在知道 MVC 也只是在...

【Day 15】Python MySQL

今天发烧用手机打字 後面明天一定补完QQ 明天是不是该想想要做什麽mysql小projectㄌ.....

JS Promise DAY77

常见的非同步问题(不限於 AJAX) 回呼地狱 写法不一致 无法同时执行(jQuery有并行语法,但...