Освобождение памяти в php5

atamur

Guest
Освобождение памяти в php5

При выполнении длинных операций php выползает за ращрешенные 8мб памяти.

Происходит это при использовании propel библиотеки.

Что я могу делать в своем коде для очистки памяти?
 

Кром

Новичок
>При выполнении длинных операций php выползает за ращрешенные 8мб памяти.
>Что я могу делать в своем коде для очистки памяти?

Не делать таких длинных операций. Оптимизировать алгоритмы, уничтожать переменные и объекты, если они больше не используются, вовремя закрывать неиспользуемые соединения и т.д. и т.п.
 

atamur

Guest
Originally posted by Кром
Не делать таких длинных операций. Оптимизировать алгоритмы, уничтожать переменные и объекты, если они больше не используются, вовремя закрывать неиспользуемые соединения и т.д. и т.п.
Как уничтожать переменные и объекты?
Достаточно ли делать unset?
 

Кром

Новичок
В общем случае да.
Почитай обязательно комментарии по [m]unset[/m].
Использование памяти можешь смотреть с помощью [m]memory_get_usage[/m]/ (комментарии тоже почитай).
 

atamur

Guest
Originally posted by Кром
В общем случае да.
Почитай обязательно комментарии по [m]unset[/m].
Использование памяти можешь смотреть с помощью [m]memory_get_usage[/m]/ (комментарии тоже почитай).
Спасибо

-~{}~ 31.01.05 18:36:

К сожалению, unset не помогает, т.к. корень проблемы оказался не в "висящих" объектах.

У меня следующая ситуация. Есть робот, который поднимается по крону. У него есть список задач, которые он должен выполнить в виде массива ('имя_класса', 'файл_с_классом')

дальше он выполняется следующим образом:
PHP:
foreach ($jobs as $jobName => $jobFile) {
			try {
				print $jobName." start: ".(memory_get_usage()/1024)."kb\n";
				$this->getLogger()->notice("Started $jobName => $jobFile"); 
				require_once($jobFile);
				//$job = new $jobName($this->getLogger());
				//$job->execute();
				//unset($job);
				print $jobName." end: ".(memory_get_usage()/1024)."kb\n";
			} catch (Exception $e) {
				/*@var e Exception*/
				$this->getLogger()->err($e->getMessage()."(Line: ".$e->getLine().", File: ".$e->getFile().")");	
			} 
}
Так вот, даже в таком виде, как я написал, т.е. с закомментированными вызовами любых действий (включаемые файлы не содержать только классы и никакого выполняемого кода) результаты принтов следующие:
Код:
Transferer start: 406.1796875kb
Transferer end: 2119.4453125kb
Robot start: 2121.4375kb
Robot end: 5557.34375kb
Activator start: 5559.6171875kb
Activator end: 7532.8046875kb
HashCleaner start: 7534.9296875kb
HashCleaner end: 7882.9609375kb
если добавить сюда около 200кб реально используемых в процессе работы данных, то легко видеть, что скрипт без напряга вылетает за разрешенные 8мб

Может кто-нибудь что-нибудь посоветовать?
(Например, как инклюдить файлы в другом потоке)
 
Сверху