Day 19,筆者已經把抽象類別 CacheProvider 寫好了,並規劃了 5 個抽象方法:

  • doGet()
  • doSet()
  • doDelete()
  • doClear()
  • doHas()

在 Driver 目錄下的各個 Cache Driver 只要專心把功能邏輯寫進這 5 個方法即可。於是筆者開始動手寫第一支 Driver,類別為 File,一支以最基本的檔案系統進行快取檔案建立、讀取、寫入、刪除的快取類別。

File 類別

範例:/day-20/src/SimpleCache/Driver/File.php

建構子

1

Day 17 的模擬使用情境中,在各個 Driver 的建構子已經決定要用單一個陣列參數。而在 File Driver,只需要知道快取的檔案要放在那一個目錄。

第 24 行是由 AssertTrait 提供的斷言檢查,如果目錄無法寫入快取的檔案則會丟出異常。

doGet()

2

由於檔案內容是經過序列化的字串,因此使用 unserialize 函式還原資料。

doSet()

3

參數的 $key 是快取的檔案名稱,以便於直接判斷是否有該快取檔案。其於資料以陣列型式儲存。

  • timestamp - 快取檔案儲存時的時間戳記。
  • ttl - 快取的存活時間。(單位:秒)
  • value - 快取的主要內容。

將其使用 serialize 序列化資料後,使用 file_put_contents 函式存入檔案。然後改變該檔案屬型為 0640 的可寫入權限。

doDelete()

4

判斷檔案路徑是否為檔案,是的話則刪除檔案。

doClear()

5

注意,一定要特別判斷檔案是否為快取才刪除。不然只要是檔案就刪除,設錯目錄則是一場災難。
因此目錄內,副檔名為 .cache 則刪除。

doHas()

6

判斷快取檔案是否存在。

getFilePath()

7

File Driver 的私有方法,訂定快取的檔案名稱,特別加了副檔名 .cache 以供 doDelete 識別以免誤刪不是快取的檔案。

測試

範例:/day-20/tests/SimpleCache/Driver/FileTest.php

Imgur

直接把昨天 Mock 類別的測試拿過來,並加了第 41 至 53 行來測試快取的效期。
第 47 行,快取的存活時間設為 5 秒。
第 51 行,停止 6 秒等待快取過期。

Imgur

測試成功。

總結

看了筆者的解說,會發現,原來寫一支快取用的函式庫是這麼簡單吧!

明天,筆者會持續寫其它 Cache Driver,但細節邏輯其實都是實現 Cache Provider 的 5 個抽象方法而已。就不另在提及了。

本篇進度的程式碼
鐵人賽而生的專案程式碼

配合鐵人賽而生的專案程式碼會隨時修改,不一定會和本篇文章一樣。如看範例,請見本篇進度的程式碼。

接下來會寫好 Redis Driver,然後明天會介紹的是,CI 測試。我們明天見。

最後修改日期: 2022-02-08

作者

留言

撰寫回覆或留言

發佈留言必須填寫的電子郵件地址不會公開。