Утечка памяти в PHP / Zend ... кажется, истощает память при каждой загрузке страницы - PullRequest
1 голос
/ 12 января 2012

Я управляю сайтом, который медленно, но верно истощает всю доступную память в Apache. Не уверен, как долго это продолжалось - сервер настроен на автоматическую перезагрузку, если достигнут предел памяти, а системный администратор настроил Apache так, чтобы потоки перезагружались (я забыл точные детали здесь ... в основном он останавливает сервер, умирающий, когда память полностью израсходована).

Некоторые технические характеристики:

  • PHP 5.3.2
  • Zend Framework 1.11.7
  • Учение 2.0.2
  • Twig 1.0.0-RC2
  • Цвиг (связывает 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);

Это не полный код - я попытался включить части, которые, по моему мнению, могут быть полезны.

Любые идеи будут высоко оценены ... Спасибо.

1 Ответ

1 голос
/ 23 января 2012

Apache с mod_php будет подчиняться директиве MaxRequestsPerChild , если требуется.Это может перезапустить процесс Apache / mod_php после (скажем) 10 000 запросов на устранение любых утечек памяти.После того, как это произойдет, вы можете начать некоторые расследования относительно того, где именно происходит проблема, и таким образом устранить проблему.Для этого может пригодиться простое использование memory_get_usage () или использование Xdebug / XHprof для более широкого профилирования памяти.

...