为啥 file_get_contents 比 memcache_get 快?

Posted

技术标签:

【中文标题】为啥 file_get_contents 比 memcache_get 快?【英文标题】:Why is file_get_contents faster than memcache_get?为什么 file_get_contents 比 memcache_get 快? 【发布时间】:2012-03-22 06:37:44 【问题描述】:

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

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

我正在通过 Macports、OS X 10.6.8 使用 php 5.2.17。

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

【问题讨论】:

【参考方案1】:

因为 file_get_contents mmaps 是文件,所以你只会有几个文件系统调用,这最终会在文件系统缓存中。 memcache 涉及对 memcached 的进程外调用(以及集群实现上的服务器外调用)。

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

【讨论】:

啊,有趣。您是说在一直加载各种 XML 文件的 Web 服务器上,memcache 方法的性能可能 在某些情况下会更好? (我希望部署在一个低端的 Linux VPS 上,可能有 512MB 的 RAM - 对于 memcache 默认保留的默认 64M 内存来说有足够的空闲空间。) 不过,我想知道从 FS 缓存中剔除某些内容的争用是否同样可能会从 memcache 缓存中剔除某些内容;-) 在专用于一个应用程序的 VPS 上,您应该能够让所有东西都适合。然而,它值得“正确调整”你的缓存:如果足够的话,使用 32M 或更少的内存缓存。如果您的应用是基于 PHP 的,请确保您使用的是 APC 或 Xcache。不要忘记,如果您使用 mysql,您可以通过调整 MySQL 缓存获得良好的性能红利,... 512Mb 足够小,您需要明智地分配。 好建议,虽然我离部署还有一段距离。无论如何,它的流量会非常低,我应该认为 - 只是一个副项目! TerryE 打勾,@Mantriur 打+1 - 两者都非常有用。谢谢。【参考方案2】:

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

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

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

【讨论】:

我希望你是对的。我想我希望file_get_contents 每次都执行一些 磁盘活动(也许是查看文件是否已更改),而memcache_get 根本不需要执行任何操作。因此,我期望 memcache 方法会更快......不过这并没有浪费时间,因为我认为我刚刚学到了一些东西 :) 在一个非常通用的级别上,FS 缓存与您的 PHP 内存缓存做同样的事情 - 除了它更加专业并且不是用脚本语言编写的。 :) 除非文件内容发生变化,否则缓存不需要再次访问该文件。如果系统上有大量 IO 活动刷新文件缓存,则单独的缓存机制将是有意义的。 @TerryE 打勾,Mantriur 打+1 - 两者都非常有用。谢谢。【参考方案3】:

在内存缓存中存储 XML 文件对我来说意义不大。

我宁愿存储解析的值,节省阅读和解析。

【讨论】:

您似乎对存储格式感到困惑,不知道如何正确使用它们。序列化 XML 对象很奇怪。与内存缓存中的存储数组相同,它已经是一个数组 磨损与否 - 这只是对在内存中存储 XML 文件的所有混乱情况的描述。

以上是关于为啥 file_get_contents 比 memcache_get 快?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在使用 file_get_contents() 时出现 500 错误,但在浏览器中有效?

php __destruct 为啥通过 file_get_contents 得到不同的结果

为啥我在网络活动下的 firefox 和 chrome 开发工具中看不到 file_get_contents 请求?

php 编程,使用file_get_contents('http://www.vketch.com/')获取远程页面超时为啥不会返回false

PHP file_get_contents 函数超时的几种解决方法

如何解决file_get_contents()函数运行时间过长的问题? - 技术问答