【问题标题】:Php high memory usagephp内存占用高
【发布时间】:2013-01-22 20:08:27
【问题描述】:

我们有一个旧的 facebook 应用程序,用原生 php 编写,运行流畅。

本月我们决定在 zend-framework 2 中重写它。昨天,在切换到新应用程序后,它导致我们的服务器崩溃,并出现大量内存不足错误。所以我们转而使用旧应用。

我安装了 xdebug 来分析应用程序。使用 memory_get_peak_usage() 函数我注意到内存使用率很高。

在旧版应用中,静态页面仅使用 1 mb 内存。但是新的在同一页面上大约使用 7-8 mb。

这是 webgrind 的前两行:

   Function                                     Invocation Count    Total Self Cost    Total Inclusive Cost
   Composer\Autoload\ClassLoader->loadClass     224                 23.31       47.20
   Composer\Autoload\ClassLoader->findFile      224                 9.57        10.23

也试过 tha apache 的 ab 工具

   ab -n 50 -c 5 -C PHPSESSID=SESSIONID http://myhost.com

结果是:

   Percentage of the requests served within a certain time (ms)
   50%    368
   66%    506
   75%    601
   80%    666
   90%   1073
   95%   1812
   98%   2278
   99%   2278
   100%   2278 (longest request)

所有这些结果都来自生产服务器而不是本地主机。

单页 7-8 mb 正常吗?如果没有,我该如何减少它?我应该在 zf2 还是 composer 中寻找它?

如果您需要,我可以提供代码示例。谢谢。

【问题讨论】:

  • 使用调试器逐步完成应用程序。在这些速率下,应该很明显什么被连续调用/实例化 100 次,没有明显的原因。

标签: php performance memory-leaks zend-framework2 composer-php


【解决方案1】:

当您将解决方案从本机迁移到 Zend 时,您必须了解 Zend 的工作方式。

Zend 由许多类组成,当您使用对象而不是原生/轻结构时,使用的内存会增加。

要提高内存使用率,请检查您的代码并执行以下操作:

  • 在函数中封装一些代码,它可以帮助垃圾收集器从内存中删除未使用的对象。
  • 在打印之前不要将大型对象列表存储在数组中,只需即时打印即可。
  • 限制在循环中创建对象(调用“new”)。

这有帮助。

【讨论】:

    【解决方案2】:

    我花了一天时间来解决问题。试过xdebug,xhprof。代码没有问题。

    我们切换回 2.0.0 并解决了问题。我不知道新版本有什么问题,现在坚持使用 2.0.0。

    总体内存使用量约为 4mb,没有崩溃。

    composer.json:

    "zendframework/zendframework": "2.0.0", 
    

    【讨论】:

      猜你喜欢
      • 2012-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多