<分区>
我有一个基于 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