我的PHP应用程序内存泄漏(使用Codeigniter Framework构建)

时间:2011-02-15 05:01:11

标签: php memory codeigniter memory-leaks

我有一个基于Codeigniter 1.7.2的PHP应用程序,目前正在生产和现场,似乎有严重的内存泄漏。

通过查看服务器上的“top”,内存泄漏很明显:

top - 23:42:13 up 26 days, 10:14,  1 user,  load average: 0.00, 0.00, 0.00
Tasks:  54 total,   1 running,  53 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st Mem:   7872040k total,   929748k used,  6942292k free,   142464k buffers
Swap:        0k total,        0k used,        0k free,   214420k cached
PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND 
22740 apache    15   0  308m  63m 5976 S    0  0.8   0:14.05 httpd 

22733 apache    15   0  298m  54m 5968 S    0  0.7   0:13.60 httpd

22736 apache    15   0  296m  52m 5968 S    0  0.7   0:13.89 httpd

22742 apache    15   0  295m  50m 5976 S    0  0.7   0:13.05 httpd

22738 apache    15   0  294m  49m 5968 S    0  0.6   0:13.30 httpd

22744 apache    15   0  293m  48m 5968 S    0  0.6   0:13.11 httpd

所以httpd使用0.8%* 7.9GB内存或大约63MB。

我知道CI加上我的应用程序的占用空间大约为7MB。我知道httpd可能有一些但不能解释63MB,如果我重启,这个数字每天都会增加。因此我得出结论是内存泄漏。

根据我对PHP 5.2.x的理解,它不完全做“垃圾收集”,但会在函数退出时释放内存,最后在脚本终止时释放内存。此外,我知道一些已知的构造可能导致内存泄漏(“子对象破坏”和递归对象引用),但我没有做任何花哨的事情。所以我有点难以解决问题所在。

我将尝试使用XDebug来跟踪它,但是我在Fedora 8上安装它时遇到了一些问题。如果有人能指出PHP 5.2.x中真正的内存泄漏的“常见嫌疑”,和/或者在Code Igniter中...我希望我能幸运,如果我知道该找什么就找到罪魁祸首(我已经搜索了CI的已知问题,但没有吸烟枪。我确实关闭了一个持续存在的功能函数之间的查询有助于减少占用空间,但它似乎仍然在泄漏)。

[root@web7 ~]# php --version
PHP 5.2.6 (cli) (built: May  8 2008 08:54:23)
    Copyright (c) 1997-2008 The PHP Group
    Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies

[root@web7 ~]# cat /proc/version
    Linux version 2.6.21.7-2.fc8xen (mockbuild@xenbuilder4.fedora.phx.redhat.com) (gcc version 4.1.2 20070925 (Red Hat 4.1.2-33)) #1 SMP Fri Feb 15 12:34:28 EST 2008

1 个答案:

答案 0 :(得分:2)

您是否尝试过在控制器中打开配置文件:

$this->output->enable_profiler(TRUE);

有趣的是看看是否有任何结果显示出某些事情比平常花费的时间更长。

此外,您可以随时尝试已经发布的CodeIgniter 2,升级是向后兼容的并且有很多修复。

- 编辑 你也可以试试这个: 我在文件/system/database/DB_driver.php的第51行找到了一个变量“var $ save_queries = TRUE;”

将此项切换为FALSE解决了我的问题。

您可以使用控制器:$ this-> db-> save_queries = FALSE;泄漏应该是一个问题。 --edit