2012-11-28 53 views
7

我使用filemtime在HTML指紋外部資源,如:PHP clearstatcache()函數的性能和參數解釋

<link rel="stylesheet" href="screen-<?=md5(filemtime('screen.css'));?>.css"> 

我注意到了有效的更新和filemtime返回的時間戳之間的顯著延遲,所以我頂部添加了clearstatcache(),這似乎解決了問題。但根據php manual

,你只需要調用clearstatcache()函數,如果你是在相同的文件名 操作執行多個,並要求有關 特定文件中的信息不會被緩存。

所以我想知道如果我正確使用它。

此外,我擔心在每次調用時完全清除緩存的性能。任何人都可以告訴我它是否會導致服務器顯着下降?


clearstatcache還接受另外兩個參數,但我不能確定它們的意義:

clear_realpath_cache是否清除真實路徑緩衝區或沒有。

清除真實路徑和只有特定文件名 的統計緩存;僅在clear_realpath_cache爲TRUE時使用。

我不明白「realpath cache」的含義,我找不到任何關於它的信息。這有什麼意義調用clearstatcache這樣:

clearstatcache(true,'/path/to/screen.css'); 

的意圖,明確只有涉及到具體的文件信息(因此減少的clearstatcache「影響」)?

+1

是否有你使用'md5(filemtime('screen.css'))'而不是'filemtime('screen.css')的原因' - 一個32位數的128位散列仍然只和底層的32位數字一樣好。 – jedwards

+0

@jedwards只是爲了有數字和字母的冷靜;-)但你是對的,性能明智的 – Giona

+0

你總是可以做一些像'dechex(filemtime('screen.css'))'甚至'str_pad(dechex (filemtime('screen.css')),8,'0',STR_PAD_LEFT)' - 只是一個想法 – jedwards

回答

1

看來你正在使用正確的功能。除非你使用其他統計函數(如文檔中列出的),否則更喜歡緩存,我不知道它會導致顯着減速的原因。

當你include('somefile')somefile可以在多個不同的位置,如經之類的東西你include_path,CWD等確定的真實路徑緩衝區只是省去了反覆搜索這些位置。

爲了您的使用,您的代碼似乎很好。

+2

感謝您的回覆。嗯,那麼我應該使用「通用」'clearstatcache()'或'clearstatcache(true,anyfileneeded)'? – Giona

+0

最有可能的是,我會使用通用的'clearstatcache()'函數。唯一的例外是如果我做更多的統計函數,我*想要緩存。 – jedwards

+0

完美,我明白你的觀點。謝謝! – Giona

2

$ clear_realpath_cache涉及對realpath函數的調用,其結果也被緩存。 這對您對filemtime的調用應該沒有影響。

+1

非常感謝。你知道爲什麼filename參數是「只有在clear_realpath_cache爲TRUE時才使用」,但它「清除了真實路徑** AND ** stat緩存僅用於特定文件名」......? – Giona

2

我不能直接給出答案。

但我建議你用md5_file('screen.css')而不是md5(filemtime('screen.css'))

+1

感謝這個「隱藏的寶石」:) – Giona

+3

我不知道這件事。這兩個片段做了非常不同的事情。第二個採用32位整數的散列。第一個採用整個文件的散列。第一個幾乎是必須做更多的工作。 (雖然我不明白爲什麼'filemtime('screen.css')'是不夠的) – jedwards