php - 我的 PHP 应用程序内存泄漏(使用 Codeigniter 框架构建)

标签 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

最佳答案

您是否尝试过在您的 Controller 中打开分析:

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

看看结果中是否突然出现任何显示某事花费的时间比平时稍长的东西会很有趣。

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

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

将此设置为 FALSE 为我解决了这个问题。

从你的 Controller 你可以使用:$this->db->save_queries = FALSE;泄漏应该是一个问题。 --编辑

关于php - 我的 PHP 应用程序内存泄漏(使用 Codeigniter 框架构建),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5000053/

相关文章:

php - 如何在codeigniter中的两个不同表中插入和更新值

php - 读取下一条记录

php - 没有显示需要显示的内容

c++ - Memcmp 似乎给我一个不正确的返回值

memory - 寻址 32 MB 字节可寻址存储器需要多少地址位?

php - undefined variable CodeIgniter?

php - CodeIgniter 中的自定义类

php - 针对 20,000 个或更多用户的 MySQL 数据库优化

php - PayPal IPN OPENSSL 错误 :14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure

memory - Docker容器和内存消耗