为什么file_get_contents比memcache_get更快?

时间:2012-03-04 14:28:07

标签: php file-io memcached php-internals

我正在使用file_get_contents从磁盘加载XML文件,作为测试,我发现我可以在3.99秒内使用file_get_contents() 1000次加载156K文件。我已经对加载的部分进行了子类化,并将其替换为内存缓存层,并且在我的开发机上发现我可以在4.54秒内完成1000次相同文档的加载。

我很欣赏file_get_contents()会做一些缓存,但看起来它实际上比一个众所周知的缓存技术更快。在单个服务器上,file_get_contents()的性能是否可以达到最佳效果?

我通过Macports,OS X 10.6.8使用PHP 5.2.17。

编辑:我发现这种大小的XML文档,使用MEMCACHE_COMPRESSED标志有一点好处。通过内存缓存的1,500个负载在6.44秒内完成(压缩)而不是6.74(不带)。但是两者都比file_get_contents慢,后者在5.71秒内的负载数相同。

3 个答案:

答案 0 :(得分:8)

因为file_get_contents mmap是文件,因此您只需要进行一些文件系统调用,这将最终出现在文件系统缓存中。 memcache涉及到memcached的进程外调用(以及集群实现上的服务器外)。

file_get_contents()的性能至关重要取决于文件系统的类型,例如,NFS挂载的文件系统上的文件没有被映射,并且此访问速度可能会慢很多。同样在多用户服务器上,文件系统缓存可以被其他进程快速刷新,而memcached缓存几乎肯定会在内存中。

答案 1 :(得分:3)

file_get_contents是检索文件的最简单方法。底层操作系统(尤其是linux)已经具备了高效的缓存机制。你做的任何其他事情都会增加开销并减慢速度。

如果从远程位置加载这些文件,Memcache会有意义。

编辑:file_get_contents最简单的方法并不一定如此。 fopen / fget 可能更快 - 我不知道。但与缓存层的复杂性相比,差异应该很小。

答案 2 :(得分:1)

在memcache中存储XML文件对我来说毫无意义。

我宁愿存储已解析的值,也无法保存读取和解析。