Поисковая форма:) поиск по free-lance.ru Топ/история/обновления фриланса, по разным параметрам (темы, сообщения, пользователи...) Автоматическое удаление постов от ненужных юзеров в топике (php скрипт) Досье(точный ник)
 

Ник (или часть ника):
?
Какой текст ищем:
?
Раздел блогов:
За срок
дней
Тип поиска: (по вхождению: по тексту гуг выдаст посты с "гуг", "гугл", "огугл"; "полнотекстовый": по тексту "гуг" выдаст посты только с "гуг")
По вхождению строки:  Полнотекстовый: 
(поиск не 100% актуальный, есть определённая задержка при обновлении данных для поиска. )
0 Всего найдено: 15
gipper2006 Сообщение 19/10/2009 14:20 Копия темы
Утечка памяти PHP скрипта Есть скрипт, который выполняет очень много итераций. Несколько тысяч может даже больше 10 тысяч. На каждой итерации создаются свои объекты с коллекциями других, обращения к БД. В конце каждой итерации использованные объекты удаляются таким образом:

$obj = null;
unset($obj);

Но все равно происходит переполнение памяти. Я подсчитал, что в результате создания объектов за каждую итерацию прибавляется 10-15 килобайт памяти, а вот после уничтожения высвобождается только 300-400 байт. Почему так... Завис, блин, на этом! Я уже пробовал и циклические ссылки удалять (в деструкторах объектов явно удалять ссылки на другие объекты и сами эти объекты).
miksir Сообщение 19/10/2009 14:47 Копия темы
Попробуйте, все же, 5.3
idle Сообщение 19/10/2009 14:50 Копия темы
Это не баг, это фича.
Пишите на перл, или си.
miksir Сообщение 19/10/2009 14:53 Копия темы
PS: циклические ссылки нельзя удалять в деструкторе, ибо до деструктора дело просто не дойдет.
Нужно для каждого класса отдельный метод – уничтожитель, где чистка ссылок, и явно его вызывать.
gipper2006 Сообщение 19/10/2009 14:59 Копия темы
Неужели так все плохо... Видимо придется писать сценарий по старинке, с кучей хитрых SQL запросов... На кой тогда этот ООП в PHP?
miksir Сообщение 19/10/2009 15:12 Копия темы
Извините, но все плохо у тех, кто "не умеет готовить". И для этих последних в 5.3 ввели сборщик мусора с учетом циклических ссылок (см gc_enable). Т.е. или вы сами аккуратно за собой убираете, или пробуете 5.3, где уберут за вами. Или просто не допускайте циклических ссылок.
И вообще ООП – это не средство ускорения скорости работы программы, это средство ускорения разработки и уменьшение стоимости поддержки всего этого.
Donate Сообщение 19/10/2009 15:48 Копия темы
+
Бывает же.
abbat Сообщение 19/10/2009 19:11 Копия темы
А скриптик можно глянуть, чтобы вопроизвести ситуацию?
gipper2006 Сообщение 20/10/2009 05:48 Копия темы
Так как убирать? Посоветовали бы что нибудь... А поучать я и сам и могу.
gipper2006 Сообщение 20/10/2009 05:54 Копия темы
Собственно вот:

foreach($valArr as $value){
//получение объекта (узел дерва)
$classObj = new Classif($value->value,$iblockObj);
//получение массива объектов Classif (родительские узлы)
$crump = $classObj->GetCrumpInArray();

foreach($crump as $cr){

$query = "SELECT COUNT(*) FROM `index_search_classes` WHERE `list`={$list} AND `company`={$company} AND `class`={$cr->id} AND `iblock`={$iblockObj->id} AND `pok`={$pok}";

$sql_res = Utils::_sql($query);
if(mysql_result($sql_res,0,0) > 0) continue;

$query = "INSERT INTO `index_search_classes` SET `list`={$list},`company`={$company},`class`={$cr->id},`iblock`={$iblockObj->id},`pok`={$pok}&q uot;;
$sql_res = Utils::_sql($query);
}
$crump = null;
unset($crump);
$classObj = null;
unset($classObj);
}

Это наиболее ресурсный участок. Здесь в основном и происходит утечка о которой говорилось выше.
abbat Сообщение 20/10/2009 06:22 Копия темы
Я имел ввиду минимальный _рабочий_ участок кода, чтобы можно было воспроизвести ситуацию у себя и посмотреть что происходит в недрах самого php. В примере, который ты привел выше, не видно, например, вызова mysql_free_result.
gipper2006 Сообщение 20/10/2009 07:28 Копия темы
Ну это надо тогда почти всю библиотеку классов выкладывать :)
abbat Сообщение 20/10/2009 07:37 Копия темы
Unit-тесты спасут мир :)
miksir Сообщение 20/10/2009 11:44 Копия темы
А разве я не посоветовал? Или 5.3 и gc_enable или чистить руками объект. Как чистить – это вам виднее, главное помнить, что объект уничтожается когда на него не остается ссылок. Т.е. пример
class A {
public $b;
}
class B {
public $a;
}

$var_a = new A();
$var_b = new B();

$var_a->b = $var_b;
$var_b->a = $var_a;

Вот имеем два объекта, которые просто так не уничтожить.
Если скажем $var_a = null; $var_b = null – ничего не произойдет, так как на объект еще остаются ссылки из других объектов.

Как чинить руками? Метод destroy() в каждом классе который будет делать $this->a = null ($this->b = null) и уничтожаем
$var_a->destroy(); $var_a = null; $var_b->destory(); $var_b = null;

Почему нельзя это делать на деструкторе? Да очень просто – деструктор вызывается сборщиком мусора при уничтожении объекта, а так как уничтожения не происходит – деструктор и не вызывается.
Ksoo Сообщение 20/10/2009 14:53 Копия темы
Память жрет это нормально для PHP.Каждый раз создавай обьект PHP просит новую память.
Когда память свободная кончаеться, запускаеться процесс сбора муссора.освобождаеться вся память которая больше не используеться.
Внешне это выглядит так что процесс с php начинает набирать обьем по памяти, доходя до предела, размер становиться очень маленьким и так до бесконечности.
0

©2008 edogs egods
Выразить восторг, поругаться
или предложить что-нибудь можно на форуме
Для обсуждения этого сервиса так же есть темы на фрилансе по
поиску , флудотопу ,и по удалённым сообщениям ,и по Актуальным/популярным темам , и по топу "кто кому больше наотвечал"