Linux、Apache HTTPD 或 PHP 是否缓存经常/最近访问的文件?

Linux、Apache HTTPD 或 PHP 是否缓存经常/最近访问的文件?

假设我们有一个简单的index.php文件:

<?php
    inclde('file1.php');
    inclde('file2.php');
    inclde('file3.php');

据推测,这最终将导致在index.php文件提供时对磁盘发出三个额外的单独 I/O 请求。

现在,假设这个文件放在一个网站上并且经常被请求。如果这些文件以某种方式缓存在内存中,而不是每次有人访问该网站时都发出 I/O 请求,那就更有意义了。

问题:

  1. Apache httpd 有缓存吗index.php
  2. 那这 3 个操作怎么样include()
  3. PHP 是否通过 Apache 从操作系统请求文件?使用哪种 mpm 模型有关系吗?
  4. nginx、lighttpd 或任何其他 Web 服务器是否进行缓存?
  5. 这是否也取决于操作系统文件系统?例如,Linux 操作系统通常会缓存经常访问的文件吗?
  6. 或者是否存在更低级别的缓存?
  7. 或者 PHP 或任何其他服务器应用程序引擎是否以某种方式缓存文件并且 I/O 请求永远不会到达操作系统?

由于磁盘 I/O 通常是最大的瓶颈,了解 Web 服务器如何在各个级别缓存文件有助于调整性能,甚至应用程序开发,例如,连接短应用程序文件而不是多个包含有助于提高性能。

谢谢你的帮助!

答案1

操作系统具有文件系统缓存,它将读/写请求缓存到实际的硬件设备。

然后是具体问题:

  1. Apache 不进行缓存。
  2. 在默认的 PHP 安装中,include() 函数不执行缓存。如果你安装了 OPCode 缓存,如 APC、Xcache 或 OPCache,那么它将在内存中缓存代码的编译版本。
  3. 文件系统访问是通过操作系统文件系统调用完成的。
  4. 他们做任何缓存都没有好处,所以他们不做。文件系统缓存对于静态文件缓存来说已经足够了,任何动态语言都有更好的缓存选择。
  5. Linux VFS 层进行缓存,因此它不是由文件系统完成的。
  6. 硬盘本身也有一些缓存,但是那一层的好处并不大,因为它没有任何有利于缓存的数据结构信息。
  7. 是的,使用答案#2中提到的适当的OPcode缓存。

答案2

是的,如果有足够的 RAM,Linux 的文件系统将缓存这些文件。所有其他层都依赖于 FS 缓存。

可能有更高级别的缓存来缓存站点的生成输出,但这必须使用 APC 等适当的模块进行专门配置。

相关内容