apache PHP内存使用情况如何真正起作用?

Sir*_*ara 16 php memory apache2 process

给出一些背景:

我最近与一位同事讨论了在PHP中使用Autoloader的问题.我赞成他们,他反对.

我的观点是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网站来说是非常基础的,所以我很想知道我是不是在这里.

我一直认为,大型网站内存是最宝贵的资源,而不是文件系统检查自动加载器的问题,而内核可能是由内核缓存的.

你是对的,是时候进行基准测试了!

Ray*_*Ray 2

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

\n\n

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

\n\n

即使 apache 线程可以处理多个请求,每个请求都会从文件中新鲜读取类,因此您的朋友“最终全部读取”是站不住脚的。

\n\n

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

\n\n

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

\n\n

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

\n\n

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

\n