首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >apache PHP内存使用到底是如何工作的?

apache PHP内存使用到底是如何工作的?
EN

Stack Overflow用户
提问于 2012-07-13 21:57:10
回答 3查看 1.3K关注 0票数 16

给出一些上下文:

最近,我和一位同事讨论了PHP中自动加载器的使用。我是支持他们的,反对他的。

我的观点是,Autoloaders可以帮助你最小化手动源代码依赖,这反过来可以帮助你减少在包含大量可能不需要的大文件时消耗的内存量。

他的回答是,包含您不需要的文件并不是一个大问题,因为在包含文件之后,Apache子进程一旦将其保留在内存中,这部分内存将可供后续请求使用。他认为,您不应该关心包含文件的数量,因为很快它们就会全部加载到内存中,并按需从内存中使用。因此,内存不是问题,而在文件系统上查找所需文件的开销则是一个更大的问题。

他是个聪明人,往往知道自己在说什么。但是,我一直认为Apache和PHP使用的内存是特定于正在处理的特定请求的。为每个请求分配一个等于memory_limit选项的内存量,任何源编译和处理只在请求的生命周期内有效。

即使使用诸如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,因为它们都是独立处理的(如果是由同一进程处理的)。

这让他回到了他的论点,即“只包含lot‘,因为你无论如何都会用到它”,而不是我的“只包含你需要的东西来降低请求大小”。

这是我构建PHP网站的基本方法,所以我很想知道我在这里是否说错了。

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

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

EN

回答 3

Stack Overflow用户

发布于 2012-07-13 22:21:21

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

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

所以我的结论是继续使用自动加载,因为它更容易使用。在你的应用程序上尝试同样的事情,并向你的朋友显示结果。

现在你不需要猜测了。

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

票数 4
EN

Stack Overflow用户

发布于 2012-07-13 22:11:06

你是更聪明的忍者,蝗虫。

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

即使Apache线程可以处理多个请求,每次请求都会从文件中读取新的类,所以你的朋友的“全部都是读的”是站不住脚的。

您可以通过在类文件中的类定义上面放一个echo 'foo';来证明这一点。您将在每个新请求上看到该行将被执行,而不管您是在开始时自动加载还是手动包含整个类文件。

我找不到任何关于这方面的简明文档--我可能会用一些内存使用示例写一些--因为我还必须向其他人解释这一点,并展示证据来理解它。我想zend的人不会认为没有人会看不到自动加载的好处。

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

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

票数 2
EN

Stack Overflow用户

发布于 2012-07-13 22:33:45

这是我的建议。

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

  1. 我想知道我的脚本从什么地方获取数据/代码。使调试更容易。
  2. 这也有配置问题,因为如果你的一个开发人员更改了文件(升级等)或配置,而事情停止工作,就很难找出哪里出了问题。
  3. 我也认为这是懒惰编程。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11471959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档