X

PHP 讀取檔案最後修改時間(防Cache)

Apache、Nginx 會去設定檔案過期時間, 然後使用者的瀏覽器就會 Cache 起來, 下次訪問就不用再要一次檔案, 但是如果檔案更新了, 瀏覽器知道檔案需要來重新抓取呢? (如何防止讀取到 Cache 的檔案?)

一個最簡單的方式, 就是更改 URL, 如下述:

  • http://example.com/demo.jpg → http://example.com/demo.jpg?v=1
  • 註1: Apache、Nginx、CDN 都可以用此方法來解決.
  • 註2: 某些 CDN 廠商不吃 "?" 後面的參數, 就無法使用此種解法.

一般常用察覺檔案變更後, 修改 URL 的方式會有下述幾種:

  • 版本自己累加(或抓取 svn 版號): http://example.com/demo.jpg → http://example.com/demo.jpg?v=1
  • Hash: http://example.com/demo.jpg → http://example.com/demo.js?v=<?php echo md5('demo.jpg'); ?>
  • 檔案修改時間: http://example.com/demo.jpg → http://example.com/demo.jpg?v=<?php echo filemtime('demo.jpg'); ?>

優缺點比較:

  • 使用 "版本自己累加" 的方式, 會比較辛苦, 會比較偏向手動, 比較容易造成忘了更新.
  • 使用 "Hash" 的方法會比較操, 如果那個檔案異常的大, 每次存取都會造成系統不小的 Loading. (ex: Ubuntu.iso)
  • 目前我使用的是讀取 "檔案修改時間" 的方式, 不管檔案大小, 只要抓取檔案最後變動的時間, 就可以馬上變更此URL.

PHP 讀取檔案最後修改時間 程式範例

  • function display_filelink($real_file_path, $url = 'http://example.com/')
  • 先說明使用方式:
    • $real_file_path: 存取的檔案位置(含檔名), ex: ../demo.js, /tmp/cache/demo.js
    • $url: 網址(需含 http://, 結尾需要有 "/"), ex: http://example.com/, //example.com/demo/)
    • 此 Function 只會抓取 $real_file_path 的最後檔名來用, 如果有相關目錄、位置需要指定, 要寫於 $url 的參數內.

程式碼如下述:

Tsung: 對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.
Related Post