【发布时间】: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