проблемы с памятью?

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
avalak
Сообщения: 47
Зарегистрирован: 2011.01.03, 03:21

проблемы с памятью?

Сообщение avalak »

Добрый день. Пишу проект на 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 метров.
Может быть кто нибудь пояснит что происходит с памятью?

Аватара пользователя
Stamm
Сообщения: 407
Зарегистрирован: 2010.03.14, 18:59
Откуда: Россия, Москва
Контактная информация:

Re: проблемы с памятью?

Сообщение Stamm »

Чтобы узнать, что происходит с памятью, поставьте xdebug. Включите режим профилирования. И через kcachegrind посмотрите.

avalak
Сообщения: 47
Зарегистрирован: 2011.01.03, 03:21

Re: проблемы с памятью?

Сообщение avalak »

@Stamm Дельный совет.
Но всё оказалось довольно прозаично. Блок, конечно, закеширован (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(); } ?>
upd
Ну и да, память жрёт AR.

Werewolf
Сообщения: 98
Зарегистрирован: 2010.02.27, 14:37
Контактная информация:

Re: проблемы с памятью?

Сообщение Werewolf »

Разве $dataProvider не заполняется каждый раз заново?

avalak
Сообщения: 47
Зарегистрирован: 2011.01.03, 03:21

Re: проблемы с памятью?

Сообщение avalak »

@Werewolf
эээ. Это ведь кеширование блока, соответственно должен кешироваться вывод виджета и, в данном случае, по истечении срока перестраиваться.
upd
Ну а сами данные забираются в виджете.

Werewolf
Сообщения: 98
Зарегистрирован: 2010.02.27, 14:37
Контактная информация:

Re: проблемы с памятью?

Сообщение Werewolf »

Да, да, ошибся, он в виджете fetchData выполняет.

Аватара пользователя
BuCeFaL
Сообщения: 447
Зарегистрирован: 2010.03.17, 21:22
Откуда: Kiev
Контактная информация:

Re: проблемы с памятью?

Сообщение BuCeFaL »

Werewolf писал(а):Да, да, ошибся, он в виджете fetchData выполняет.
Если класс объекта $dataProvider CActiveDataProvider и он инициализируеться в контроллере (до вьюшки) тогда не ошибся и при каждом запуске заново создаеться $dataProvider но выводиться кэш.

avalak
Сообщения: 47
Зарегистрирован: 2011.01.03, 03:21

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:     /**

Аватара пользователя
Stamm
Сообщения: 407
Зарегистрирован: 2010.03.14, 18:59
Откуда: Россия, Москва
Контактная информация:

Re: проблемы с памятью?

Сообщение Stamm »

А ставили schemaCachingDuration ?

Аватара пользователя
BuCeFaL
Сообщения: 447
Зарегистрирован: 2010.03.17, 21:22
Откуда: Kiev
Контактная информация:

Re: проблемы с памятью?

Сообщение BuCeFaL »

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

avalak
Сообщения: 47
Зарегистрирован: 2011.01.03, 03:21

Re: проблемы с памятью?

Сообщение avalak »

@Stamm
Да, 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 в контроллере ни на что конкретно не влияет (из интереса пробовал очищать лишние данные, эффект дало лишь уменьшение количества обработанных элементов дерева (например вывод только корневых элементов))

avalak
Сообщения: 47
Зарегистрирован: 2011.01.03, 03:21

Re: проблемы с памятью?

Сообщение avalak »

Мой бох! кто ж знал что память отжирает ->render()

zibert02
Сообщения: 203
Зарегистрирован: 2010.11.24, 17:29

Re: проблемы с памятью?

Сообщение zibert02 »

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:     /**

нашли чего лезет ошибка? у меня счас тоже самое

zibert02
Сообщения: 203
Зарегистрирован: 2010.11.24, 17:29

Re: проблемы с памятью?

Сообщение zibert02 »

опытным путем обнаружил что это изза строки Yii::app()->cache->set($id, $dataProvider);
получается CActiveDataProvider нельзя кешировать?

Ответить