Я управляю сайтом, который медленно, но верно истощает всю доступную память в 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);
Это не полный код - я попытался включить части, которые, по моему мнению, могут быть полезны.
Любые идеи будут высоко оценены ... Спасибо.