2011-02-15 23 views
6

我有一個基於Codeigniter 1.7.2構建的PHP應用程序,目前正在生產和生活中,似乎存在嚴重的內存泄漏。我的PHP應用程序中的內存泄漏(使用Codeigniter Framework構建)

內存泄漏是從服務器上看着「頂部」表觀:

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的是使用的存儲器或約63MB 0.8%* 7.9GB。

我知道CI加我的應用程序有一個約7MB的足跡。我知道httpd可能有一些,但不能解釋63MB,再加上這個數字每天如果我重新啓動。因此我得出結論說存在內存泄漏。

從我對PHP 5.2.x的理解來看,它並不完全「垃圾收集」,而是在函數退出時釋放內存並最終釋放腳本。此外,我知道一些可能導致內存泄漏的已知構造(「子對象破壞」和遞歸對象引用),但我沒有做任何奇特的事情。所以我有點難以解決問題。

我將嘗試使用XDebug進行追蹤,但我在Fedora 8上安裝它時遇到了一些問題。如果任何人都可以在PHP 5.2.x中指出一些「常見的嫌疑犯」 /或者在代碼點火器中......我希望我能幸運地找到罪魁禍首,如果我知道要找什麼(我已經搜索了一些已知的CI問題但沒有吸菸槍,我確實關閉了一個功能,在功能之間持續查詢,這有助於減少佔用空間,但它似乎仍然在泄漏)。

[[email protected] ~]# 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 

[[email protected] ~]# cat /proc/version 
    Linux version 2.6.21.7-2.fc8xen ([email protected]) (gcc version 4.1.2 20070925 (Red Hat 4.1.2-33)) #1 SMP Fri Feb 15 12:34:28 EST 2008 
+2

http://anantgarg.com/2009/03/10/php-xdebug-webgrind-installation/ – 2011-02-15 06:38:31

+1

這可能是值得你通過[PHP 5 Changelog](http://php.net) /ChangeLog-5.php),並查看是否有任何內存泄漏從5.2.6與您的代碼一起修復... – 2011-02-15 09:19:02

回答

2

您是否嘗試過在旋轉控制器譜上:

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

將是有趣的,看看是否有任何在該結果,顯示的東西是時間比平常長了一點莊稼了。

此外,您可以隨時嘗試CodeIgniter 2,它現在已經發布,升級向後兼容,並有很多修復。上線51文件/system/database/DB_driver.php

切換爲FALSE解決; 我發現了一個變量「變量$ save_queries = TRUE」:

--edit 你也試試這個問題給我。

從您的控制器,您可以使用:$ this-> db-> save_queries = FALSE;泄漏應該是一個問題。 - 編輯