如何刪除 CodeIgniter 快取頁面

最近很忙

先來點技術筆記

有個客人說網頁顯示速度有點慢…

DSC01406

之前放 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 裡面

直接把這個快取檔案刪掉即可

至於快取檔的檔名 就用上面那段程式碼產生即可

這樣一來就可以兼具效率跟彈性啦~

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *