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

Pet*_*erG 6 php memory memory-leaks codeigniter

我有一个基于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
Run Code Online (Sandbox Code Playgroud)

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

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

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

我将尝试使用XDebug来跟踪它,但是我在Fedora 8上安装它时遇到了一些问题.如果有人能指出PHP 5.2.x和/或代码中的真正内存泄漏的"常见嫌疑" 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
Run Code Online (Sandbox Code Playgroud)

dav*_*zie 2

您是否尝试过在控制器中打开分析:

\n\n
$this->output->enable_profiler(TRUE);\n
Run Code Online (Sandbox Code Playgroud)\n\n

看看结果中是否出现任何表明某些事情花费的时间比平时长一点的事情会很有趣。

\n\n

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

\n\n

--edit\n你也可以尝试这个:\n我在文件 /system/database/DB_driver.php 的第 51 行找到了一个变量 \xe2\x80\x9cvar $save_queries = TRUE;\xe2\x80\x9d

\n\n

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

\n\n

从您的控制器中,您可以使用: $this->db->save_queries = FALSE; 哪里应该出现泄漏问题。\n--编辑

\n