[CodeIgniter] 記憶體的隱形殺手:Log all queries

更新 發佈閱讀 4 分鐘
此文章同步刊登於我的部落格

一、前言

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

執行結果:

raw-image

從執行結果可以清楚的了解每個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;PHP

來避免log紀錄吃掉大量記憶體導致記憶體溢出的狀況



三、結語

我們都知道使用框架非常方便


可以省去很多重複的動作

以CodeIgniter中的db物件來說

最大的幫助就是減少了每次都要防範SQL injection功夫

還有串接SQL語法的麻煩

但是框架最大的隱患就是使用它提供的「方便

但卻不知道框架到底在背後做了什麼事情


我們需要思考一個問題:

你在使用這些方便的工具生成SQL語法時

真的知道它實際上執行的SQL語句長什麼樣子嗎?

會不會程式效率很差的原因就出在框架?


這篇並不是鼓勵不要使用框架

而是想分享一個觀念:不要過度依賴任何工具

真的清楚自己做了甚麼事情才不會哪一天被自己給坑了


環境

  • CodeIgniter 3
留言
avatar-img
留言分享你的想法!
avatar-img
Hankz是名工程師
8會員
11內容數
你可以在這裡看到後端工程師的技術文章 也可以看到一些投資相關的心得分享 歡迎交流~
Hankz是名工程師的其他內容
2024/03/28
在PHP中可以用$this、self、與static代表自己這個類別,有些人可能搞不清楚他們的區別,尤其是self、與static,但是他們各別有自己的意義和用法,在實戰中這些些微的差別可能就會造成不可預期的問題,本文仔細說明了他們之間的差別。
Thumbnail
2024/03/28
在PHP中可以用$this、self、與static代表自己這個類別,有些人可能搞不清楚他們的區別,尤其是self、與static,但是他們各別有自己的意義和用法,在實戰中這些些微的差別可能就會造成不可預期的問題,本文仔細說明了他們之間的差別。
Thumbnail
看更多
你可能也想看
Thumbnail
2025 九月最後一次 vocus 創作者推薦來啦!從日本獨旅專家、與兩歲娃的南法親子旅行,到台灣健行筆記,結合色彩與符號學的文化觀察,還有透過斜槓的前往理想生活的路途,邀請你跟著 vocus 創作者,用一百種視野探索這個世界!
Thumbnail
2025 九月最後一次 vocus 創作者推薦來啦!從日本獨旅專家、與兩歲娃的南法親子旅行,到台灣健行筆記,結合色彩與符號學的文化觀察,還有透過斜槓的前往理想生活的路途,邀請你跟著 vocus 創作者,用一百種視野探索這個世界!
Thumbnail
在溫哥華這座被大自然擁抱的城市,不會游泳的人也能在水裡泡一泡~~感受清涼和放鬆。 剛到溫哥華時,我去史丹利公園騎腳踏車,意外經過了 Second Beach Pool。那一眼真是讓我久久不能自己( • ̀ω•́ ),泳池的前方就是開闊的 English Bay,看到泳池裡的人群漂浮在海天之間。
Thumbnail
在溫哥華這座被大自然擁抱的城市,不會游泳的人也能在水裡泡一泡~~感受清涼和放鬆。 剛到溫哥華時,我去史丹利公園騎腳踏車,意外經過了 Second Beach Pool。那一眼真是讓我久久不能自己( • ̀ω•́ ),泳池的前方就是開闊的 English Bay,看到泳池裡的人群漂浮在海天之間。
Thumbnail
七星山主峰已走過幾次,這次要探探沒走過的夢幻湖↔️東峰段路線,補上「陽明山東西大縱走」中的七星山段。因為不喜歡原路折返,所以規劃一個簡易 小O路線,可以免費停車,還能把心頭好的秋芒看好看滿,很推薦的路線唷!
Thumbnail
七星山主峰已走過幾次,這次要探探沒走過的夢幻湖↔️東峰段路線,補上「陽明山東西大縱走」中的七星山段。因為不喜歡原路折返,所以規劃一個簡易 小O路線,可以免費停車,還能把心頭好的秋芒看好看滿,很推薦的路線唷!
Thumbnail
2025年9月1日起,臺新多張信用卡將整合為臺新Richart卡,並推出七大刷卡方案。本文詳細分析各方案優缺點、停卡教學及其他信用卡推薦,協助讀者選擇最適合自己的方案。
Thumbnail
2025年9月1日起,臺新多張信用卡將整合為臺新Richart卡,並推出七大刷卡方案。本文詳細分析各方案優缺點、停卡教學及其他信用卡推薦,協助讀者選擇最適合自己的方案。
Thumbnail
首先,最關鍵的問題就是「原創」是否有必要性? 我認為答案是否定的,因為原作者在翻拍時就創作了《今際之國的闖關者 RETRY》,講述的是有栖成為心理諮詢師後,因為救人意外再次被捲入遊戲世界。這樣的續作已經能自然承接主線。如今這種「硬原創」,只會讓整個 IP 的口碑下滑,新角色也淪為犧牲品。
Thumbnail
首先,最關鍵的問題就是「原創」是否有必要性? 我認為答案是否定的,因為原作者在翻拍時就創作了《今際之國的闖關者 RETRY》,講述的是有栖成為心理諮詢師後,因為救人意外再次被捲入遊戲世界。這樣的續作已經能自然承接主線。如今這種「硬原創」,只會讓整個 IP 的口碑下滑,新角色也淪為犧牲品。
Thumbnail
「知道自己怎麼了,然後呢?現狀還是沒有任何改變。」伴侶與諮商師晤談之前,曾與我描述她的狀態:「其實道理我都知道,已經發生很多次,我也在狀態好的時候練習過很多次。可是現在腦海的雜亂聲音不斷攻擊我,我知道『可以』怎麼想比較好、知道那些聲音是怎麼來的,也知道躺平軟爛你也不會覺得我怎樣。但知道又如何?
Thumbnail
「知道自己怎麼了,然後呢?現狀還是沒有任何改變。」伴侶與諮商師晤談之前,曾與我描述她的狀態:「其實道理我都知道,已經發生很多次,我也在狀態好的時候練習過很多次。可是現在腦海的雜亂聲音不斷攻擊我,我知道『可以』怎麼想比較好、知道那些聲音是怎麼來的,也知道躺平軟爛你也不會覺得我怎樣。但知道又如何?
Thumbnail
一轉眼,咩咩就已經九個多月大了,天氣也漸漸涼了起來,可以開始真的帶去爬山囉! 住在新店已經六年了,選擇二格山當她們的第一座小百岳,非常有意義。而且這天天氣超級好,視野好到超乎預期,連大霸尖山和南湖大山都一清二楚! 雖然我們作弊從小格頭起登,來回也才1.2k上一百多,但她們都玩得非常開心呢!
Thumbnail
一轉眼,咩咩就已經九個多月大了,天氣也漸漸涼了起來,可以開始真的帶去爬山囉! 住在新店已經六年了,選擇二格山當她們的第一座小百岳,非常有意義。而且這天天氣超級好,視野好到超乎預期,連大霸尖山和南湖大山都一清二楚! 雖然我們作弊從小格頭起登,來回也才1.2k上一百多,但她們都玩得非常開心呢!
Thumbnail
CodeIgniter 3 和 Laravel 是兩種不同的 PHP 框架,各有其特點和適用場景。CodeIgniter 3 是一個輕量級框架,Laravel 是一個功能強大的現代 PHP 框架,同樣都有Models的它們有什麼樣的差別呢?
Thumbnail
CodeIgniter 3 和 Laravel 是兩種不同的 PHP 框架,各有其特點和適用場景。CodeIgniter 3 是一個輕量級框架,Laravel 是一個功能強大的現代 PHP 框架,同樣都有Models的它們有什麼樣的差別呢?
Thumbnail
介紹工作後幾個常見的小問題,包括寫 Log 的好習慣、本地印出錯誤或過程、PHPCS 工具、變數儲存於設定檔、避免魔術數字、程式碼靜態分析與動態分析。
Thumbnail
介紹工作後幾個常見的小問題,包括寫 Log 的好習慣、本地印出錯誤或過程、PHPCS 工具、變數儲存於設定檔、避免魔術數字、程式碼靜態分析與動態分析。
Thumbnail
在寫CI的時候是否曾經遇過out of memory的錯誤呢?CodeIgniter作為輕量化的PHP框架,db物件一直是操作資料庫的好幫手,簡化了下達sql指令時的操作,加快了開發的速度,但其實看似好用的工具裡說不定有著隱藏的問題。
Thumbnail
在寫CI的時候是否曾經遇過out of memory的錯誤呢?CodeIgniter作為輕量化的PHP框架,db物件一直是操作資料庫的好幫手,簡化了下達sql指令時的操作,加快了開發的速度,但其實看似好用的工具裡說不定有著隱藏的問題。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News