Утечка памяти в моем 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
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; Где утечка должна быть проблемой. -- редактировать