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 的參數內.
程式碼如下述: