标签存档: Cache

关于PHP对文件元信息的缓存

今天在测试 SAE (Sina App Engine) 的Memcache Wrapper 时发现,PHP会在同一个页面的执行过程中对文件的元信息进行缓存。

根据PHP文档对 clearstatcache() 这个方法的说明得知:
在使用 stat(), lstat(), file_exists(), is_writable(), is_readable(), is_executable(), is_file(), is_dir(), is_link(), filectime(), fileatime(), filemtime(), fileinode(), filegroup(), fileowner(), filesize(), filetype(), 或 fileperms() 方法查询文件信息时,PHP会将文件的stat的缓存以提高性能。 clearstatcache()方法可以用来清除这个缓存。另外unlink()会自动清除stat缓存。

例如以下一段程序:

1
2
3
4
5
6
file_put_contents("test.txt", "test_content\n");
var_dump(filesize("test.txt"));
file_put_contents("test.txt", "test_content\n", FILE_APPEND);
var_dump(filesize("test.txt"));
clearstatcache();
var_dump(filesize("test.txt"));

最后会输出

int(13)
int(13)
int(26)

但是通过阅读PHP源码,我发现只有在对本地文件进行unlink, rename和rmdir操作时会清除stat缓存,而在通过其他的wrapper进行unlink, rename和rmdir操作时,并不会清除stat缓存。因此在写wrapper时我们要自己在unlink等方法中通过clearstatcache()来清除stat。