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

本文另外刊登于我的部落格: 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>';}

执行结果:
http://img2.58codes.com/2024/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语句长甚么样子吗?
会不会程式效率很差的原因就出在框架?

这篇并不是鼓励不要使用框架
而是想分享一个观念:不要过度依赖任何工具
真的清楚自己做了甚么事情
才不会哪一天被自己给坑了

环境

CodeIgniter 3


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章