在 Day 19,筆者已經把抽象類別 CacheProvider 寫好了,並規劃了 5 個抽象方法:
- doGet()
- doSet()
- doDelete()
- doClear()
- doHas()
在 Driver 目錄下的各個 Cache Driver 只要專心把功能邏輯寫進這 5 個方法即可。於是筆者開始動手寫第一支 Driver,類別為 File
,一支以最基本的檔案系統進行快取檔案建立、讀取、寫入、刪除的快取類別。
File 類別
範例:/day-20/src/SimpleCache/Driver/File.php
建構子
在 Day 17 的模擬使用情境中,在各個 Driver 的建構子已經決定要用單一個陣列參數。而在 File Driver,只需要知道快取的檔案要放在那一個目錄。
第 24 行是由 AssertTrait 提供的斷言檢查,如果目錄無法寫入快取的檔案則會丟出異常。
doGet()
由於檔案內容是經過序列化的字串,因此使用 unserialize
函式還原資料。
doSet()
參數的 $key
是快取的檔案名稱,以便於直接判斷是否有該快取檔案。其於資料以陣列型式儲存。
- timestamp - 快取檔案儲存時的時間戳記。
- ttl - 快取的存活時間。(單位:秒)
- value - 快取的主要內容。
將其使用 serialize
序列化資料後,使用 file_put_contents
函式存入檔案。然後改變該檔案屬型為 0640
的可寫入權限。
doDelete()
判斷檔案路徑是否為檔案,是的話則刪除檔案。
doClear()
注意,一定要特別判斷檔案是否為快取才刪除。不然只要是檔案就刪除,設錯目錄則是一場災難。
因此目錄內,副檔名為 .cache
則刪除。
doHas()
判斷快取檔案是否存在。
getFilePath()
File Driver 的私有方法,訂定快取的檔案名稱,特別加了副檔名 .cache
以供 doDelete
識別以免誤刪不是快取的檔案。
測試
範例:/day-20/tests/SimpleCache/Driver/FileTest.php
直接把昨天 Mock 類別的測試拿過來,並加了第 41 至 53 行來測試快取的效期。
第 47 行,快取的存活時間設為 5 秒。
第 51 行,停止 6 秒等待快取過期。
測試成功。
總結
看了筆者的解說,會發現,原來寫一支快取用的函式庫是這麼簡單吧!
明天,筆者會持續寫其它 Cache Driver,但細節邏輯其實都是實現 Cache Provider 的 5 個抽象方法而已。就不另在提及了。
配合鐵人賽而生的專案程式碼會隨時修改,不一定會和本篇文章一樣。如看範例,請見本篇進度的程式碼。
接下來會寫好 Redis Driver,然後明天會介紹的是,CI 測試。我們明天見。
留言