Утечка памяти в моем PHP-приложении (построенном с помощью фреймворка Codeigniter) [закрыто]


У меня есть PHP-приложение, построенное на Codeigniter 1.7.2, которое в настоящее время находится в производстве и работает, и, похоже, имеет серьезную утечку памяти.

Утечка памяти очевидна при взгляде на "верх" на сервере:

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,9 ГБ памяти или около 63 МБ.

Я знаю, что CI плюс мое приложение занимает около 7 МБ. Я знаю, что у httpd, вероятно, есть некоторые, но не могу объяснить 63 МБ, плюс это число увеличивается ежедневно, если я перезагружаюсь. Таким образом, я пришел к выводу, что было воспоминание утечка.

Из моего понимания PHP 5.2.x, он не совсем выполняет "сборку мусора", но освобождает память при выходе из функции и, наконец, при завершении сценария. Кроме того, я знаю несколько известных конструкций, которые могут привести к утечке памяти ("уничтожение дочерних объектов" и рекурсивные ссылки на объекты), но я не делаю ничего такого необычного. Так что я немного озадачен, в чем может быть проблема.

Я собираюсь попытаться отследить его с помощью XDebug, но у меня возникли некоторые проблемы с его установкой на Фетровая шляпа 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 ([email protected]) (gcc version 4.1.2 20070925 (Red Hat 4.1.2-33)) #1 SMP Fri Feb 15 12:34:28 EST 2008
Author: Cœur, 2011-02-15

1 answers

Вы пробовали включить профилирование в своем контроллере:

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

Было бы интересно посмотреть, появится ли что-нибудь в результатах того, что показывает, что что-то занимает немного больше времени, чем обычно.

Кроме того, вы всегда можете попробовать CodeIgniter 2, который уже выпущен, обновление обратно совместимо и содержит множество исправлений.

--редактировать Вы также можете попробовать это: Я нашел переменную "var $save_queries = TRUE;" в строке 51 в файле /system/database/DB_driver.php

Переключение этого значения на FALSE решило проблему для меня.

С вашего контроллера вы можете использовать: $this->db->save_queries =FALSE; Где утечка должна быть проблемой. -- редактировать

 2
Author: davzie, 2011-09-18 22:58:13