2012-11-28 33 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