PHP / Zend中的内存泄漏...似乎在每个页面加载时耗尽内存

时间:2012-01-11 22:49:58

标签: php performance zend-framework memory doctrine

我运行的网站缓慢但肯定会耗尽Apache中的所有可用内存。不知道它发生了多长时间 - 如果达到内存限制,服务器设置为自动重启,并且sysadmin设置了Apache以便线程被回收(我忘记了这里的具体细节......基本上当内存全部用完时,它会停止服务器死机。)

一些技术规格:

  • PHP 5.3.2
  • Zend Framework 1.11.7
  • Doctrine 2.0.2
  • Twig 1.0.0-RC2
  • Zwig(将Zend + Twig联系在一起)

我设法找到了什么:

  • 如果我在网站上加载页面,内存使用率会上升 - 不是很大,但是如果我转到另一个页面,服务器就没有释放上一个请求的任何内存。但是,如果我只是重新加载当前页面,它似乎没问题。我从/ proc / meminfo
  • 中提取内存使用信息
  • 使用sysadmin,我们认为cron作业不应该受到责备 - 如果你在几个不同的页面之间移动,即使当时没有运行cron作业,也会出现内存使用率持续上升的问题。 / LI>
  • 我认为泄漏发生在$ application-> run();在index.php。

学说可能是罪魁祸首,但我并非百分百肯定。 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);

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

任何想法都会非常感谢...谢谢。

1 个答案:

答案 0 :(得分:1)

如果需要,带有mod_php的Apache将遵守'MaxRequestsPerChild' directive。这可以在(例如)10,000个请求之后重新启动Apache / mod_php进程以清除任何内存泄漏。在此之后,您可以开始调查问题的确切位置,从而解决问题。像使用memory_get_usage()这样简单的东西可能对此有用,或者使用Xdebug / XHprof进行更广泛的内存分析。