如何刪除 CodeIgniter 快取頁面
2017 Aug 13 CodeIgniter
最近很忙 先來點技術筆記 有個客人說網頁顯示速度有點慢...
之前放 Linode 的時候
客戶說慢
結果去看 Linode (tokyo1) 連線
真的一直掉封包
問 Linode 他們說這沒辦法解決(怒)
唯一的方法只能換到 tokyo2
但 IP 不能保留
因為我是虛擬主機
一堆客人要因此換 DNS
這不是辦法
所以只好另外弄一台 Google 台灣的機器給客人放
之後似乎就沒事了
結果前幾天又說慢
我真的很懷疑客人是故意找麻煩的
打開頁面 平均都 1.2 秒就讀完了
是哪裡慢啊?
客人還附帶說明
產品清單頁如果點 view all 的話
會很慢
我想 廢話啊
view all 在他們的解釋
就是顯示該分類所有產品
如果那個分類有 100 個產品
那程式就得讀 100 個產品
有 1000 個產品
就要讀 1000 個
怎麼可能不慢?
他們的理由是
因為客戶很懶
會想一直瀏覽
不想點下一頁
理論上這種東西要用瀑布流
但瀑布流弄下去 SEO 方面可能造成 Google 無法收錄
(當然也有方法可以解 但不想弄得這麼複雜)
想想只好動腦筋到 cache 了
CodeIgniter 有內建頁面 cache 的功能
直接在 controller 加入 $this->output->cache(10);
就行了 10 是你要 cache 幾分鐘 結果問題就來了
因為畫面上有些資訊 不能快取
例如 如果你的選單上有購物車商品數量
有用戶名稱 就不能快取
因為一快取
第一個產生快取的用戶名稱/購物車商品數量
就會跑到第二個讀取頁面的人的頁面上
以這個客人來說
我的選單上有購物車數量
右邊還有一個購物車捲入的 html 區塊
所以這兩個我都得換成 ajax
讓頁面顯示後
再另外跟 server 要
然後還有一個更麻煩的事情
就是客戶說
如果他變更產品資料
前端不會馬上變更
這很正常
因為是快取檔案咩
就是要等時間過了才會變更
但萬一管理者修改的是價錢
那不免就會產生糾紛 所以理論上
只要管理者變更了內容
系統應該要自動把快取檔刪除
讓前台第一個瀏覽的倒楣鬼
觸發系統 產生新的快取檔案
但是 CodeIgniter 的 cache 似乎沒有讓我們取得某個 URL 快取檔名稱的函數
偷偷看了一下產生 cache file 的程式碼
在 system/core/Output.php 裡 找到 function _write_cache
可以看到這段程式碼
$cache_path = ($path == '') ? APPPATH.'cache/' : $path;
if ( ! is_dir($cache_path) OR ! is_really_writable($cache_path)) { log_message('error', "Unable to write cache file: ".$cache_path); return; }
$uri = $CI->config->item('base_url'). $CI->config->item('index_page'). $CI->uri->uri_string();
$cache_path .= md5($uri);
很明顯的 CodeIgniter 的 cache filename 是用 URL 做 md5 得到的
所以我們也可以自己透過 URL 來知道 CodeIgniter 產生了那個快取檔
我可以在產品 update 的 function 裡面
直接把這個快取檔案刪掉即可 至於快取檔的檔名
就用上面那段程式碼產生即可 這樣一來就可以兼具效率跟彈性啦~