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

更新於 2024/05/02閱讀時間約 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
7會員
21內容數
你可以在這裡看到後端工程師的技術文章 也可以看到一些投資相關的心得分享 歡迎交流~
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Hankz是名工程師 的其他內容
由於開發多個專案的時候,頻繁切換本地環境的PHP版本實在太麻煩,於是想要可以直接使用指令就完成切換的功能,於是有了這篇文章。
Simple Storage Service (S3) 是 AWS 最常應用到的服務,只要是需要將檔案上傳到雲端的狀況都可以使用S3,本篇文章將介紹如何設定與使用AWS S3。
在使用laravel中的Queue job的時候 如果希望job中斷還可以重新啟動這個時候就會需要用到Supervisor了 本篇文章為您帶來如何使用Supervisor執行Laravel的queue:work的教學
在PHP的團隊開發中,PHP CS Fixer可以確保每個開發人員的Coding Style相同,是相當重要的工具。本篇文章將會詳細說明PHP CS Fixer在Linux環境下的安裝方式。
Composer是PHP的軟體套件管理系統,它提供用於管理PHP軟體和依賴庫關係的標準格式。通常以專案為單位進行管理,會在專案根目錄底下(預設是vendor)安裝套件,除此外可以安裝全局套件。
本文將介紹在Windows環境中安裝SQL Server及相關PHP擴展,以進行與SQL Server的串接。透過本文所述步驟,您將能在Windows環境中順利進行PHP與SQL Server串接設定。
由於開發多個專案的時候,頻繁切換本地環境的PHP版本實在太麻煩,於是想要可以直接使用指令就完成切換的功能,於是有了這篇文章。
Simple Storage Service (S3) 是 AWS 最常應用到的服務,只要是需要將檔案上傳到雲端的狀況都可以使用S3,本篇文章將介紹如何設定與使用AWS S3。
在使用laravel中的Queue job的時候 如果希望job中斷還可以重新啟動這個時候就會需要用到Supervisor了 本篇文章為您帶來如何使用Supervisor執行Laravel的queue:work的教學
在PHP的團隊開發中,PHP CS Fixer可以確保每個開發人員的Coding Style相同,是相當重要的工具。本篇文章將會詳細說明PHP CS Fixer在Linux環境下的安裝方式。
Composer是PHP的軟體套件管理系統,它提供用於管理PHP軟體和依賴庫關係的標準格式。通常以專案為單位進行管理,會在專案根目錄底下(預設是vendor)安裝套件,除此外可以安裝全局套件。
本文將介紹在Windows環境中安裝SQL Server及相關PHP擴展,以進行與SQL Server的串接。透過本文所述步驟,您將能在Windows環境中順利進行PHP與SQL Server串接設定。
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
跟我前年2021年高潮停利出清時說明的內容是大同小異 新的圖只是有比較多細節部分的記憶體循環 每一個階段只是"習慣科技的題材不同"從PC>手機>AI 大同小異 最低點都會是人性最恐懼的時候 最高點都會是人性興奮算殖利率跟本益比的時候 這張圖剛好15年 也剛好在我的記憶體產業操作量化
Thumbnail
「關渡美術館」其實是隸屬於北藝大的校園美術館,也是臺灣第一所位於大學校園內的美術館。筆者於今(2023)年10月份初次造訪關渡美術館觀展,結果對於這座美術館感到非常「印象深刻」...
Thumbnail
對於記憶體來說,從去年下半年開始到今年是一段頗嚴峻的時期 但根據美光發布財報後所顯示的資料,這樣的頹勢或許將要被扭轉了.....
Thumbnail
上一篇題到半導體可以藉由通電改變電阻,進而做成開關,實現運算這個重要的事,這裡再來提其他半導體的妙用 記憶體 半導體做成的記憶體結構其實有很多種,像是六顆MOS組成的SRAM(Static random-access memory, 靜態隨機存取記憶體)、一個電容加上一顆MOS做成的DRAM(D
Thumbnail
自從3月底從十多個夜景中選出了三個景點跟大家分享後,好幾個人來敲碗,說看不過癮啦!好啦好啦,叔叔收到了,朕知道了。以下我從去年12月的夜景中再挑出三個,沒有囉,不會有下次了,這次寫完了就不再寫夜景了,別得寸進尺,整理照片很辛苦的,別再敲碗了!
Thumbnail
東京夜景是世界最美的景色之一,幾乎每次來日本玩,都會安排去觀景台欣賞。高樓大廈和燈光在夜晚創造出令人驚嘆的景象。早年333公尺高的東京鐵塔最受歡迎,從各角度都可看到美麗景色;這十年來,634公尺高的晴空塔迷人夜景,燈光設計獨特,成為旅日必到之處。疫情後則是澀谷天空當紅,十字路口是必看夜景⋯⋯
Thumbnail
在《以你的名字呼喚我》裡,最讓人難忘的愛情信物是蜜桃,既是夏日多汁誘人的甜蜜水果,也是狂暴愛情與肉體歡愉的象徵。在《紳士的等待》裡,同樣也有屬於義大利又代表愛情的特殊水果——怒果,聞起來有檸檬香茅與薰衣草的香氣,嚐起來卻有百香果、石榴與芭樂的風味。
「我聽著周杰倫的夜曲,想起了戴著耳機走過母校走廊的畫面......」 這種因為使用媒體而想起人生經歷的事情,大家經歷過嗎? 有些學者就對於這個現象很感興趣,於是就做了這篇研究,看看到底是什麼因素使我們在使用媒體的時候想起了人生!
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
跟我前年2021年高潮停利出清時說明的內容是大同小異 新的圖只是有比較多細節部分的記憶體循環 每一個階段只是"習慣科技的題材不同"從PC>手機>AI 大同小異 最低點都會是人性最恐懼的時候 最高點都會是人性興奮算殖利率跟本益比的時候 這張圖剛好15年 也剛好在我的記憶體產業操作量化
Thumbnail
「關渡美術館」其實是隸屬於北藝大的校園美術館,也是臺灣第一所位於大學校園內的美術館。筆者於今(2023)年10月份初次造訪關渡美術館觀展,結果對於這座美術館感到非常「印象深刻」...
Thumbnail
對於記憶體來說,從去年下半年開始到今年是一段頗嚴峻的時期 但根據美光發布財報後所顯示的資料,這樣的頹勢或許將要被扭轉了.....
Thumbnail
上一篇題到半導體可以藉由通電改變電阻,進而做成開關,實現運算這個重要的事,這裡再來提其他半導體的妙用 記憶體 半導體做成的記憶體結構其實有很多種,像是六顆MOS組成的SRAM(Static random-access memory, 靜態隨機存取記憶體)、一個電容加上一顆MOS做成的DRAM(D
Thumbnail
自從3月底從十多個夜景中選出了三個景點跟大家分享後,好幾個人來敲碗,說看不過癮啦!好啦好啦,叔叔收到了,朕知道了。以下我從去年12月的夜景中再挑出三個,沒有囉,不會有下次了,這次寫完了就不再寫夜景了,別得寸進尺,整理照片很辛苦的,別再敲碗了!
Thumbnail
東京夜景是世界最美的景色之一,幾乎每次來日本玩,都會安排去觀景台欣賞。高樓大廈和燈光在夜晚創造出令人驚嘆的景象。早年333公尺高的東京鐵塔最受歡迎,從各角度都可看到美麗景色;這十年來,634公尺高的晴空塔迷人夜景,燈光設計獨特,成為旅日必到之處。疫情後則是澀谷天空當紅,十字路口是必看夜景⋯⋯
Thumbnail
在《以你的名字呼喚我》裡,最讓人難忘的愛情信物是蜜桃,既是夏日多汁誘人的甜蜜水果,也是狂暴愛情與肉體歡愉的象徵。在《紳士的等待》裡,同樣也有屬於義大利又代表愛情的特殊水果——怒果,聞起來有檸檬香茅與薰衣草的香氣,嚐起來卻有百香果、石榴與芭樂的風味。
「我聽著周杰倫的夜曲,想起了戴著耳機走過母校走廊的畫面......」 這種因為使用媒體而想起人生經歷的事情,大家經歷過嗎? 有些學者就對於這個現象很感興趣,於是就做了這篇研究,看看到底是什麼因素使我們在使用媒體的時候想起了人生!