【问题标题】:Memory leak in PHP / Zend... seems to drain memory on every page loadPHP / Zend 中的内存泄漏......似乎在每次页面加载时都会耗尽内存
【发布时间】:2012-02-08 07:37:22
【问题描述】:

我运行的站点缓慢但肯定会耗尽 Apache 中的所有可用内存。不知道它已经持续了多长时间 - 如果达到内存限制,服务器将设置为自动重启,并且系统管理员已设置 Apache 以便回收线程(我忘记了这里的确切细节......基本上当内存全部用完时,它会阻止服务器死亡)。

一些技术规格:

  • PHP 5.3.2
  • Zend 框架 1.11.7
  • 教义 2.0.2
  • Twig 1.0.0-RC2
  • Zwig(将 Zend+Twig 链接在一起)

我发现了什么:

  • 如果我在网站上加载一个页面,内存使用量会上升 - 不会显着增加,但是如果我转到另一个页面,服务器并没有从之前的请求中释放任何内存。但是,如果我只是重新加载当前页面,它似乎没问题。我正在从 /proc/meminfo 中提取内存使用信息
  • 与系统管理员一起工作,我们认为 cron 作业不应受到指责 - 如果您在几个不同的页面之间移动,即使当时没有运行 cron 作业,也会出现内存使用量持续上升的问题。
  • 我认为泄漏发生在 $application->run();在 index.php 中。

教义可能是罪魁祸首,但我不能 100% 确定。 Doctrine 通过引导程序中的 _initDoctrine 方法运行。我正在使用的一些位如下:

    $config = new Configuration;
    $arrayCache = new ArrayCache;

    $cache = new Doctrine\Common\Cache\MemcacheCache;
    $memcache = new Memcache;
    $memcache->connect('localhost', 11211);
    $cache->setMemcache($memcache);
    $cache->setNamespace("PDC_");
    \Zend_Registry::set("pdc_memcache", $cache);
    //$query->setResultCacheDriver($cache);

    $config->setMetadataCacheImpl($arrayCache);
    $config->setQueryCacheImpl($arrayCache);

    // Metadata Driver
    $driverImpl = $config->newDefaultAnnotationDriver(array(APPLICATION_PATH.'/Db/Entities'));
    $config->setMetadataDriverImpl($driverImpl);

    // Proxy configuration
    $config->setProxyDir(APPLICATION_PATH.'/Db/Proxies');
    $config->setProxyNamespace('Dpp\Proxies');
    //if (APPLICATION_ENV == "development") {
    $config->setAutoGenerateProxyClasses(true);

这不是完整的代码 - 我已尝试包含我认为可能有用的部分。

任何想法将不胜感激...谢谢。

【问题讨论】:

  • PHP 是否作为 fcgi 模块运行?你的服务器有多少内存?
  • 你看过这里吗? - stackoverflow.com/questions/1145775/…
  • 你在缓存中实际存储了什么?限制在多大范围内?
  • 是的,肯定是缓存问题。每次请求后内存都在增长,而不是释放,这是 memcache 的工作,你没有在技术规范中列出 memcache 的事实让我觉得你可能忘记为 memcache 购买一些 RAM :-)
  • @phpdev 我们有 4GB RAM。关于 fcgi 会回来找你的。

标签: php performance zend-framework memory doctrine


【解决方案1】:

如果需要,带有 mod_php 的 Apache 将遵循 'MaxRequestsPerChild' directive。这可以在(比如说)10,000 个请求以清理任何内存泄漏后重新启动 Apache/mod_php 进程。完成之后,您可以开始调查问题发生的确切位置,从而消除问题。使用memory_get_usage() 之类的简单方法可能对此有用,或者使用 Xdebug/XHprof 进行更广泛的内存分析。

【讨论】:

  • 谢谢,我们确实实现了这一点,以保持服务器至少运行。将研究内存分析。自从我们开始缓存一些正在加载在每个页面上的数据以来,已经看到了一些改进,希望随着我们继续优化,我们会看到更多改进。
猜你喜欢
  • 2014-08-18
  • 2021-10-01
  • 2021-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多