16

给出一些背景:

我最近和一位同事讨论了在 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 网站是相当基础的,所以我很想知道我是否在这里偏离了目标。

我也一直相信,对于大型网站来说,内存是最宝贵的资源,而且比文件系统检查可能被内核缓存的自动加载器更值得关注。

不过,您是对的,是时候进行基准测试了!

4

3 回答 3

4

以下是你赢得争论的方法:运行现实的基准测试,并站在数字的右边。

我也有同样的讨论,所以我尝试了一个实验。使用 APC,我尝试了一个带有单个整体包含(包含所有 Kohana)以及标准自动加载器的 Kohana 应用程序。最终结果是,单个包含以统计上不相关的速率(小于 1%)更快,但使用的内存略多(根据 PHP 的内存函数)。在没有 APC(或 XCache 等)的情况下运行测试是没有意义的,所以我没有打扰。

所以我的结论是继续使用自动加载,因为它使用起来更简单。在您的应用中尝试相同的操作并向您的朋友展示结果。

现在你不需要猜测了。

免责声明:我没有使用 Apache。我不能强调在自己的应用程序上在自己的硬件上运行自己的基准测试。不要相信我的经验会是你的。

于 2012-07-13T14:21:21.160 回答
2

你是更聪明的忍者,蚱蜢。

在请求类之前,自动加载器不会加载类文件。这意味着它们最多将使用与手动包含的相同数量的内存,但通常要少得多。

即使 apache 线程可以处理多个请求,每个请求也会从文件中重新读取类,因此您的朋友“最终全部被读取”并不成立。

您可以通过添加 echo 'foo' 来证明这一点;在类文件中的类定义之上。无论您是在启动时自动加载还是手动包含整个类文件,您都会在每个新请求中看到该行将被执行。

我找不到任何好的简明文档——我可能会写一些带有一些内存使用示例的文档——因为我还必须向其他人解释这一点并出示证据以使其深入了解。我认为 zend 的人没想到任何人都不会看到自动加载的好处。

是的,apc 之类的(就像所有缓存解决方案一样)可以克服资源的负面影响,甚至可以在性能上获得小幅提升,但是如果您在大量库上执行此操作并提供大量服务,则会消耗大量不需要的内存的客户。尝试一些事情,比如在一个庞大的包含文件中加载一个健康的梨库块,同时处理 500 个连接到您的页面。

即使使用 Apc 之类的东西,您也可以从使用任何非命名空间类(目前大多数现有的 php 代码)的自动加载器中受益,因为它可以帮助避免在处理大量类库时造成全局命名空间污染。

于 2012-07-13T14:11:06.377 回答
0

这是我的意见。

我认为自动装载机是一个非常糟糕的主意,原因如下

  1. 我想知道我的脚本从什么地方获取数据/代码。使调试更容易。
  2. 这也存在配置问题,如果您的开发人员之一更改文件(升级等)或配置并且事情停止工作,则更难找出它被破坏的地方。
  3. 我也认为这是懒惰的编程。

至于内存/性能问题,如果计算机正在为此苦苦挣扎,那么为计算机购买更多内存同样便宜。

于 2012-07-13T14:33:45.077 回答