假设我们有一个简单的index.php
文件:
<?php
inclde('file1.php');
inclde('file2.php');
inclde('file3.php');
据推测,这最终将导致在index.php
文件提供时对磁盘发出三个额外的单独 I/O 请求。
现在,假设这个文件放在一个网站上并且经常被请求。如果这些文件以某种方式缓存在内存中,而不是每次有人访问该网站时都发出 I/O 请求,那就更有意义了。
问题:
- Apache httpd 有缓存吗
index.php
? - 那这 3 个操作怎么样
include()
? - PHP 是否通过 Apache 从操作系统请求文件?使用哪种 mpm 模型有关系吗?
- nginx、lighttpd 或任何其他 Web 服务器是否进行缓存?
- 这是否也取决于操作系统文件系统?例如,Linux 操作系统通常会缓存经常访问的文件吗?
- 或者是否存在更低级别的缓存?
- 或者 PHP 或任何其他服务器应用程序引擎是否以某种方式缓存文件并且 I/O 请求永远不会到达操作系统?
由于磁盘 I/O 通常是最大的瓶颈,了解 Web 服务器如何在各个级别缓存文件有助于调整性能,甚至应用程序开发,例如,连接短应用程序文件而不是多个包含有助于提高性能。
谢谢你的帮助!
答案1
操作系统具有文件系统缓存,它将读/写请求缓存到实际的硬件设备。
然后是具体问题:
- Apache 不进行缓存。
- 在默认的 PHP 安装中,include() 函数不执行缓存。如果你安装了 OPCode 缓存,如 APC、Xcache 或 OPCache,那么它将在内存中缓存代码的编译版本。
- 文件系统访问是通过操作系统文件系统调用完成的。
- 他们做任何缓存都没有好处,所以他们不做。文件系统缓存对于静态文件缓存来说已经足够了,任何动态语言都有更好的缓存选择。
- Linux VFS 层进行缓存,因此它不是由文件系统完成的。
- 硬盘本身也有一些缓存,但是那一层的好处并不大,因为它没有任何有利于缓存的数据结构信息。
- 是的,使用答案#2中提到的适当的OPcode缓存。
答案2
是的,如果有足够的 RAM,Linux 的文件系统将缓存这些文件。所有其他层都依赖于 FS 缓存。
可能有更高级别的缓存来缓存站点的生成输出,但这必须使用 APC 等适当的模块进行专门配置。