2017-01-12 33 views
0

我想將md5哈希追加到css和js文件,以便能夠在瀏覽器中長期緩存它們。在PHP中追加文件md5 hash到url

在Python的Django有一個很簡單的方法來做到這一點,靜態模板標籤https://docs.djangoproject.com/en/1.10/ref/templates/builtins/#std:templatetag-static

我想,做在PHP中完全一樣的東西,包括在構建時生成散列圖書館,不是運行。

我已經看到了SO老同一個問題: hash css and js files to break cache. Is it slow?,但它從來沒有得到有關如何做MD5哈希的答案,所以我再次問。

+0

MD5對此不是一個好的選擇。簡單地使用mtime,或者如果你真的關心內容(爲什麼內容會改變但不是mtime?)使用像CRC32這樣的超便宜的東西。 – ThiefMaster

+0

@ThiefMaster,MD5 beins slow是我提到的「在構建時生成哈希,而不是運行時」的原因,這種方式在Django中完成 – slaweet

回答

2

在PHP中,您通常會使用filemtime。例如:

// $file_url is defined somewhere else 
// and $file_path you'd know as well 

// getting last modified timestamp 
$timestamp = filemtime($file_path); 

// adding cache-busting md5 
$file_url .= '?v=' . md5($timestamp); 

(你可以直接使用$timestamp爲好)

如果你想擁有從文件內容計算MD5,你可以使用md5_filelinky),並做一些事情,如:

// getting the files md5 
$md5 = md5_file($file_path); 

// adding cache-busting string 
$file_url .= '?m=' . $md5; 

或者使用CRC32,這是更快:

// getting the files crc32 
$crc32 = hash_file ('crc32' , $file_path); 

// adding cache-busting string 
$file_url .= '?c=' . $crc32; 

請注意不要在大量文件或大型文件上執行此操作。除非您經常部署未修改的文件(您不應該這麼做),否則時間戳方法會更快更輕,並且足夠滿足絕大多數目的。

+0

感謝您的建議,但我想要基於文件內容,而不是修改日期。因爲在部署時所有文件都被複制到服務器(更改時間戳),但並非所有文件都必須被修改。 – slaweet

+0

@slaweet,更新後的答案對你有幫助嗎? – yivi

+0

感謝您的更新。 CRC32聽起來是一個不錯的選擇。 – slaweet