проблемы с памятью?
проблемы с памятью?
Добрый день. Пишу проект на yii, возник некоторый ... вопрос, чтоли. Ошибки как таковой нет, но есть дикое потребление памяти.
Есть модуль: древовидные комментарии (AR-модель -> CActiveDataProvider -> ATreeView(строит дерево)), от которого потом будут наследоваться расширения.
Ubuntu 10.04.1, PHP 5.3.2-1ubuntu4.5 with Suhosin-Patch (nginx+php5-fpm), версия Yii 1.1.5
Тестовая выборка: 1k записей, вложенность, 1.4kb текст комментария, AR плюшки( 'user' => array(self::BELONGS_TO, 'User', 'user_id'), )
всё работает. быстро, чудно, даже, вроде бы, памяти много не жрёт ... конечно же закешированно.
На старте (в начале представления)
time: 0.02384sec. mem: 1.79MB
После постройки/вывода (в данном случае вывод из APC Cahce (больше ничего ресурсоёмкого нет))
time: 0.02991sec. mem: 4.92MB
В конце index.php (на соседних страницах потребление памяти ожидаемое (~2-3mb))
time: 0.10603sec. mem: 14.36MB
Ошибок нет(ни в работе скрипта ни в логах). Учитывая кеширование ничего выполнятся не должно. Yii просто забирает лишние 10 метров.
Может быть кто нибудь пояснит что происходит с памятью?
Есть модуль: древовидные комментарии (AR-модель -> CActiveDataProvider -> ATreeView(строит дерево)), от которого потом будут наследоваться расширения.
Ubuntu 10.04.1, PHP 5.3.2-1ubuntu4.5 with Suhosin-Patch (nginx+php5-fpm), версия Yii 1.1.5
Тестовая выборка: 1k записей, вложенность, 1.4kb текст комментария, AR плюшки( 'user' => array(self::BELONGS_TO, 'User', 'user_id'), )
всё работает. быстро, чудно, даже, вроде бы, памяти много не жрёт ... конечно же закешированно.
На старте (в начале представления)
time: 0.02384sec. mem: 1.79MB
После постройки/вывода (в данном случае вывод из APC Cahce (больше ничего ресурсоёмкого нет))
time: 0.02991sec. mem: 4.92MB
В конце index.php (на соседних страницах потребление памяти ожидаемое (~2-3mb))
time: 0.10603sec. mem: 14.36MB
Ошибок нет(ни в работе скрипта ни в логах). Учитывая кеширование ничего выполнятся не должно. Yii просто забирает лишние 10 метров.
Может быть кто нибудь пояснит что происходит с памятью?
- Stamm
- Сообщения: 407
- Зарегистрирован: 2010.03.14, 18:59
- Откуда: Россия, Москва
- Контактная информация:
Re: проблемы с памятью?
Чтобы узнать, что происходит с памятью, поставьте xdebug. Включите режим профилирования. И через kcachegrind посмотрите.
Re: проблемы с памятью?
@Stamm Дельный совет.
Но всё оказалось довольно прозаично. Блок, конечно, закеширован (duration 3600) и, формально, строится ничего не должно, да и лог говорит что данные берутся из кеша ... но тем не менее даже при кешировании виджет работает.
upd
Ну и да, память жрёт AR.
Но всё оказалось довольно прозаично. Блок, конечно, закеширован (duration 3600) и, формально, строится ничего не должно, да и лог говорит что данные берутся из кеша ... но тем не менее даже при кешировании виджет работает.
Код: Выделить всё
<?php if($this->beginCache('commentBlock', array('duration'=> Yii::app()->params['basicCacheDuration'], ))) { ?>
<?php $this->widget('application.modules.comment.components.ATreeView', array(
'dataProvider'=>$dataProvider,
'itemView'=>'_comment',
)); ?>
<?php $this->endCache(); } ?>
Ну и да, память жрёт AR.
Re: проблемы с памятью?
Разве $dataProvider не заполняется каждый раз заново?
Re: проблемы с памятью?
@Werewolf
эээ. Это ведь кеширование блока, соответственно должен кешироваться вывод виджета и, в данном случае, по истечении срока перестраиваться.
upd
Ну а сами данные забираются в виджете.
эээ. Это ведь кеширование блока, соответственно должен кешироваться вывод виджета и, в данном случае, по истечении срока перестраиваться.
upd
Ну а сами данные забираются в виджете.
Re: проблемы с памятью?
Да, да, ошибся, он в виджете fetchData выполняет.
Re: проблемы с памятью?
Если класс объекта $dataProvider CActiveDataProvider и он инициализируеться в контроллере (до вьюшки) тогда не ошибся и при каждом запуске заново создаеться $dataProvider но выводиться кэш.Werewolf писал(а):Да, да, ошибся, он в виджете fetchData выполняет.
Re: проблемы с памятью?
@BuCeFaL
Ну, я думаю тут имелось в виду именно getData, а не само создание объекта. Впрочем не суть важно)
ЗЫ В любом случае $dataProvider тоже кешируется.
Кстати, никто не сталкивался с тем что при первом запуске при включении кеша вылетает ошибка (в дальнейшем всё нормально и проблема не возникает):
Ну, я думаю тут имелось в виду именно getData, а не само создание объекта. Впрочем не суть важно)
ЗЫ В любом случае $dataProvider тоже кешируется.
Код: Выделить всё
$source = 1;
$id = 'adp'.$source.'_'.md5($source); // dummy key
$dataProvider = Yii::app()->cache->get($id);
if($dataProvider == null)
{
$criteria = new CDbCriteria;
$criteria->compare('parent_id', $source, true);
$criteria->limit = 0;
$criteria->with = array('user',);
$dataProvider = new CActiveDataProvider('Comment', array(
'criteria' => $criteria,
'sort' => array(
'defaultOrder' => 'create_time ASC',
),
'pagination' => array(
'pageSize' => 100000, //Yii::app()->params['postsPerPage'],
),
));
Yii::app()->cache->set($id, $dataProvider);
}
Код: Выделить всё
PHP Error
Описание
Trying to get property of non-object
Исходный код
/home/lessar/www_nginx/nginx/framework/db/ar/CActiveRecord.php(616)
00604: */
00605: public function getActiveRelation($name)
00606: {
00607: return isset($this->getMetaData()->relations[$name]) ? $this->getMetaData()->relations[$name] : null;
00608: }
00609:
00610: /**
00611: * Returns the metadata of the table that this AR belongs to
00612: * @return CDbTableSchema the metadata of the table that this AR belongs to
00613: */
00614: public function getTableSchema()
00615: {
00616: return $this->getMetaData()->tableSchema;
00617: }
00618:
00619: /**
00620: * Returns the command builder used by this AR.
00621: * @return CDbCommandBuilder the command builder used by this AR
00622: */
00623: public function getCommandBuilder()
00624: {
00625: return $this->getDbConnection()->getSchema()->getCommandBuilder();
00626: }
00627:
00628: /**
Re: проблемы с памятью?
Выходит с кеша в памят загружаеться объект и весит в пямяти до завершения работы сценария. Или что то я не так понял.
Re: проблемы с памятью?
@Stamm
Да, schemaCachingDuration включено. Собственно, мне кажется, это и вызывает ошибку(при первом запуске не находит схемы и отдаёт ошибку, при втором и последующих схема закеширована и всё нормально (пробовал ставить маленькие значения кеширования схемы, но ошибок это не вызывало даже при устаревании кеша)). Конфигурацию сейчас показать не могу, тк не на рабочем компьютере. (база - mysql, кодировка utf-8, prepare включено, профилирование включено).
upd
@BuCeFaL
Нет, там всё же именно в виджете идёт получение и обработка данных. Сам по себе $dataProvider в контроллере ни на что конкретно не влияет (из интереса пробовал очищать лишние данные, эффект дало лишь уменьшение количества обработанных элементов дерева (например вывод только корневых элементов))
Да, schemaCachingDuration включено. Собственно, мне кажется, это и вызывает ошибку(при первом запуске не находит схемы и отдаёт ошибку, при втором и последующих схема закеширована и всё нормально (пробовал ставить маленькие значения кеширования схемы, но ошибок это не вызывало даже при устаревании кеша)). Конфигурацию сейчас показать не могу, тк не на рабочем компьютере. (база - mysql, кодировка utf-8, prepare включено, профилирование включено).
upd
Код: Выделить всё
'db' => array(
'connectionString' => 'mysql:host=localhost;dbname=yiidbq;port=3306',
'username' => 'yiiuserq',
'password' => 'yiipassq',
'tablePrefix' => 'yiiq_',
'schemaCachingDuration' => 3600,
'charset' => 'utf8',
'emulatePrepare' => true,
'enableParamLogging' => true,
),
@BuCeFaL
Нет, там всё же именно в виджете идёт получение и обработка данных. Сам по себе $dataProvider в контроллере ни на что конкретно не влияет (из интереса пробовал очищать лишние данные, эффект дало лишь уменьшение количества обработанных элементов дерева (например вывод только корневых элементов))
Re: проблемы с памятью?
Мой бох! кто ж знал что память отжирает ->render()
Re: проблемы с памятью?
avalak писал(а):@BuCeFaL
Ну, я думаю тут имелось в виду именно getData, а не само создание объекта. Впрочем не суть важно)
ЗЫ В любом случае $dataProvider тоже кешируется.Кстати, никто не сталкивался с тем что при первом запуске при включении кеша вылетает ошибка (в дальнейшем всё нормально и проблема не возникает):Код: Выделить всё
$source = 1; $id = 'adp'.$source.'_'.md5($source); // dummy key $dataProvider = Yii::app()->cache->get($id); if($dataProvider == null) { $criteria = new CDbCriteria; $criteria->compare('parent_id', $source, true); $criteria->limit = 0; $criteria->with = array('user',); $dataProvider = new CActiveDataProvider('Comment', array( 'criteria' => $criteria, 'sort' => array( 'defaultOrder' => 'create_time ASC', ), 'pagination' => array( 'pageSize' => 100000, //Yii::app()->params['postsPerPage'], ), )); Yii::app()->cache->set($id, $dataProvider); }
Код: Выделить всё
PHP Error Описание Trying to get property of non-object Исходный код /home/lessar/www_nginx/nginx/framework/db/ar/CActiveRecord.php(616) 00604: */ 00605: public function getActiveRelation($name) 00606: { 00607: return isset($this->getMetaData()->relations[$name]) ? $this->getMetaData()->relations[$name] : null; 00608: } 00609: 00610: /** 00611: * Returns the metadata of the table that this AR belongs to 00612: * @return CDbTableSchema the metadata of the table that this AR belongs to 00613: */ 00614: public function getTableSchema() 00615: { 00616: return $this->getMetaData()->tableSchema; 00617: } 00618: 00619: /** 00620: * Returns the command builder used by this AR. 00621: * @return CDbCommandBuilder the command builder used by this AR 00622: */ 00623: public function getCommandBuilder() 00624: { 00625: return $this->getDbConnection()->getSchema()->getCommandBuilder(); 00626: } 00627: 00628: /**
нашли чего лезет ошибка? у меня счас тоже самое
Re: проблемы с памятью?
опытным путем обнаружил что это изза строки Yii::app()->cache->set($id, $dataProvider);
получается CActiveDataProvider нельзя кешировать?
получается CActiveDataProvider нельзя кешировать?