天天看點

聊聊Yii2和ThinkPHP5的檔案緩存

Yii2和ThinkPHP5緩存操作提供的公共方法對比

Yii2緩存提供的方法
  1. get 擷取緩存
  2. set 設定緩存資料
  3. exists 判斷緩存是否存在
  4. mset multiSet 方法别名,批量設定緩存
  5. mget multiGet 方法别名,批量擷取緩存
  6. add 添加緩存傳回true,存在則不做操作
  7. madd 批量添加多個,傳回成功插入數組
  8. delete 删除緩存
  9. flush 清空緩存所有資料
  10. offsetExists ,exists别名
  11. offsetGet ,get别名
  12. offsetSet,set别名
  13. offsetUnset,delete别名
  14. getOrSet,擷取緩存,不存在則設定緩存

ThinkPHP5緩存提供的方法

  1. get 擷取緩存
  2. set 設定緩存
  3. inc 緩存資料自增
  4. dec緩存資料自減
  5. rm 删除緩存
  6. clear 根據tag 删除緩存
  7. pull 讀取緩存并删除緩存
  8. remember讀取緩存,不存在則設定
  9. tag 緩存分組加标簽
  10. has 判斷緩存是否存在

Yii2 和ThinkPHP5 緩存操作對比

  1. 讀寫操作

    ThinkPHP5 讀寫緩存檔案都是通過file_get_contents和file_put_contents操作檔案,且不加任何鎖。是以在極端情況下,有可能會出現讀取檔案頭不對尾的情況。如果遇到多個請求同時寫緩存,會涉及到并發問題。Yii2讀取緩存加共享鎖LOCK_SH,寫緩存加排它鎖LOCK_EX保證讀寫資料完整。

  2. ThinkPHP5 雖然實作了自增自減方法,但是内部實作實際上是先讀取後設定,并且中間沒有鎖操作,是以在多個請求同時對資料進行自增自減的情況資料會不正确。如果要實作原子操作的自增自減,兩個架構都需要開發者自己去實作。
  3. Yii2緩存過期方式通過修改檔案的更改時間記錄過期時間。ThinkPHP5 則是在緩存檔案中插入過期時間資料,根據檔案最後修改時間以及過期時間确定緩存是否過期。
  4. Yii2緩存有gc機制,在每次寫入緩存的時候會以一定的機率删除過期緩存檔案。ThinkPHP5 則是在讀取緩存的時候,如果緩存過期則删除。如果緩存儲存的是多層級的檔案夾,Yii2會删除緩存檔案夾,但是ThinkPHP5 不會删除。是以ThinkPHP5 需要開發者編寫額外的腳本去定期删除緩存檔案,避免空間占用。
  5. 兩種架構都支援緩存可序列化資料。Yii2緩存操作支援自定義資料序列化方法,預設使用serialize方式。 ThinkPHP5 隻能是開發者在每次調用的時候用自定義的方法序列化在存入緩存或者使用預設serialize序列化。
  6. Yii2緩存可以設定依賴,當依賴的資料變更,緩存依賴器會将相關的緩存設定成過期狀态。ThinkPHP5 沒有。

檔案緩存中一些其他東西

  • 檔案鎖。 LOCK_SH 共享鎖(讀檔案),LOCK_EX 排它鎖(寫檔案),LOCK_UN 釋放鎖,LOCK_NB 鎖定不阻塞;寫檔案先執行寫鎖,其他程序不能讀檔案,必須等寫鎖釋放。如果讀檔案加了LOCK_NB标志,則讀檔案不阻塞,直接讀取失敗!讀檔案先執行讀鎖,其他程序可讀。寫入檔案必須等讀鎖釋放。如果寫檔案加了LOCK_NB标志,則寫檔案不阻塞,直接失敗
  • 檔案狀态緩存。PHP會緩存對檔案狀态資訊的檢查結果。如果在一個腳本中多次檢查同一個檔案,隻在最初會讀取資訊,其他都是從緩存中擷取。受影響的函數有:

    stat() lstat() file_exists() is_writable() is_readable() is_executable() is_file() is_dir() is_link() filectime() fileatime() filemtime() fileinode() filegroup() fileowner() filesize() filetype() fileperms()

    是以如果檔案被操作過或者不需要緩存檔案狀态,則需要清除檔案狀态緩存,使用

    clearstatcache

    清除檔案狀态緩存