【问题标题】:Include statement taking up 1.5 MB of memory?include语句占用1.5 MB内存?
【发布时间】:2010-07-25 07:31:28
【问题描述】:

大家好,我正在尝试优化我的应用程序,并已开始对代码的 sn-ps 进行基准测试,以确定它们占用了多少内存。我刚刚发现一个包含语句占用了多达 1.5MB 的内存。我正在使用 memory_get_usage() 在代码 sn-p 之后检查 adn 之前使用的内存。

包含的文件仅包含一个文件,但如果我尝试自己包含该嵌套包含文件,则一个包含的最大减少量仅为 768KB。这里的文件非常小,文件中唯一的代码是类定义。

这里发生的事情是正常的吗?我该如何解决这种压力。我的应用程序托管在共享主机上,我想知道这是否可能是我的应用程序死机的原因。

编辑:

这就是我进行基准测试的方式:

$m = memory_get_usage(true);
include('/...');
$m = memory_get_usage(true)-$m;
echo $m;//over 1.5 MB ?

【问题讨论】:

  • 你检查过本地主机上的脚本吗?另外,如何使用像 xdebug 这样的分析器来获得更多关于可能导致内存增加的详细信息。 (xdebug.org)
  • 在我的本地主机上,脚本运行良好。事实上,我已经尝试过真正推动本地主机的限制,但到目前为止,它甚至在我的本地系统上都没有消失。虽然它在我的本地主机上有点慢。在线但是我的应用程序刚刚死了,我怀疑使用的内存是否与它有关。

标签: php memory-management memory-leaks include


【解决方案1】:

这对我来说并不奇怪,尤其是在包含文件正在执行任何操作的情况下。 PHP 代码是即时解释的,因此 PHP 解释器需要分配大量资源才能解析和运行该文件中的代码。 1.5MB 可能看起来很多,但 PHP 解释器往往会占用大量内存。出于验证目的,您可以尝试包含另一个空文件并查看是否会触发任何内存增加。您测试同一包含文件的其他版本,并取出各种内容,看看这是否是某种持续的内存增加,或者它是否取决于现有的功能。无论如何,这听起来对我来说并不格格不入或不寻常。这很可能只是解释器分配内存以读取包含文件、为其构建某种 AST 并为其中的所有对象、值和变量预分配内存的结果。

【讨论】:

  • 问题是我基准测试的代码的 sn-p 被定期调用,是否可以像这样维护包含文件的cahce?包含的文件只是一个开始的类定义。实际上我的问题是我的应用程序托管在在线服务器上 - 并且随着更多请求的出现,它似乎消失了,我收到网络错误,所以我想知道我的系统是否太占用内存?它工作正常。虽然在我的本地主机上很慢...
  • 我不知道 - 它是否访问数据库或文件或发出网络请求或其他什么?这真的取决于代码在做什么,但如果它没有做任何这些事情,那么它很慢或内存不足似乎很奇怪。也许您可以再描述一下它在做什么?
  • @Ali:“问题是我基准测试的代码的 sn-p 被非常定期地调用,是否有可能维护这样的包含文件的cahce?”安装 PHP OpCode 缓存,例如 APC:pecl.php.net/package/APC 3.0.19 是最新的稳定版本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-13
  • 2017-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-13
相关资源
最近更新 更多