给出一些背景:
我最近和一位同事讨论了在 PHP 中使用 Autoloaders。我支持他们,他反对。
我的观点是,自动加载器可以帮助您最大限度地减少手动源依赖,这反过来可以帮助您减少在包含大量您可能不需要的大文件时消耗的内存量。
他的回答是,包含您不需要的文件不是一个大问题,因为在包含文件后,一旦它被 Apache 子进程保存在内存中,这部分内存将可用于后续请求。他认为您不应该担心包含文件的数量,因为它们很快就会全部加载到内存中并按需从内存中使用。因此,内存不是问题,尝试在文件系统上查找所需文件的开销更令人担忧。
他是个聪明人,而且往往知道他在说什么。但是,我一直认为 Apache 和 PHP 使用的内存是特定于正在处理的特定请求的。每个请求都分配了一个等于 memory_limit PHP 选项的内存量,并且任何源代码编译和处理仅在请求的生命周期内有效。
即使使用诸如 APC 之类的操作码缓存,我认为单个请求仍然需要将每个文件加载到它自己的内存部分中,并且 APC 只是为响应进程预编译它的捷径。
我一直在搜索这方面的一些文档,但到目前为止还没有找到任何东西。如果有人可以向我指出有关此主题的任何有用文档,我将不胜感激。
更新:
只是为了澄清一下,自动加载器讨论部分更多的是上下文:)。
可能还不清楚,但我的主要问题是关于 Apache 是否会将其资源集中在一起以响应多个请求(尤其是包含文件使用的内存),或者每个请求是否需要检索满足执行路径所需的代码与从同一进程处理的其他请求隔离。
例如:文件 1、2、3 和 4 大小相同,均为 100KB。请求 A 包括文件 1、2 和 3。请求 B 包括文件 1、2、3 和 4。
在他的脑海中,他认为请求 A 将在整个执行过程中消耗 300KB,而请求 B 只会再消耗 100KB,因为文件 1,2 和 3 已经在内存中。
在我看来,它是 300KB 和 400KB,因为它们都是独立处理的(如果通过相同的进程)。
这让他回到了他的论点,即“只包括很多,因为无论如何你都会使用它”,而不是我的“只包括你需要减少请求大小的东西”。
这对于我如何构建 PHP 网站是相当基础的,所以我很想知道我是否在这里偏离了目标。
我也一直相信,对于大型网站来说,内存是最宝贵的资源,而且比文件系统检查可能被内核缓存的自动加载器更值得关注。
不过,您是对的,是时候进行基准测试了!