Кеширование ActiveRecords

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Filsh
Сообщения: 77
Зарегистрирован: 2010.10.17, 11:00
Откуда: Днепропетровск
Контактная информация:

Кеширование ActiveRecords

Сообщение Filsh »

Занялся вопросом кешировани и как то оно очень долго выполняется
использую memcache
профилирую так

Код: Выделить всё

Yii::beginProfile('Test');
Users::model()->cache(3600*24)->findByPk($idUser);
Yii::endProfile('Test');
этот код из кеша выполняется за 0.55693!
при чем другие кеши отдается мометально, проблема только с ActiveRecords и построителем запросов
Почему так, и как можно оптимизировать?
Filsh
Сообщения: 77
Зарегистрирован: 2010.10.17, 11:00
Откуда: Днепропетровск
Контактная информация:

Re: Кеширование ActiveRecords

Сообщение Filsh »

единственное что пришло в голову, это то что соединение с базой открывается долго, она у меня удаленная
тогда другой вопрос, как отложить соединение, если в кеше есть данные?
Filsh
Сообщения: 77
Зарегистрирован: 2010.10.17, 11:00
Откуда: Днепропетровск
Контактная информация:

Re: Кеширование ActiveRecords

Сообщение Filsh »

это не соединение с базой, два вызова делал, оба долго отрабатывают
R3D3
Сообщения: 352
Зарегистрирован: 2010.04.11, 14:52

Re: Кеширование ActiveRecords

Сообщение R3D3 »

А без кеша быстро отрабатывает? Мемкеш находится на том же сервере что и код ?
Yii Jabber Conference: yii@conference.jabber.ru
Filsh
Сообщения: 77
Зарегистрирован: 2010.10.17, 11:00
Откуда: Днепропетровск
Контактная информация:

Re: Кеширование ActiveRecords

Сообщение Filsh »

все тестирую на домашнем ПК, но mysql удаленный, поэтому без кеша долго
Мемкеш на локальной машине вместе с кодом

интересно то что, такой код работает так

Код: Выделить всё

Yii::beginProfile('UsersInfo');
UsersInfo::model()->cache(3600*24)->findByPk($idUser); // 0.57915
Yii::endProfile('UsersInfo');

Yii::beginProfile('UsersTest');
Users::model()->cache(3600*24)->findByPk($idUser); // 0.00200
Yii::endProfile('UsersTest');
он на первое создание AR что то делает, на что тратиться куча времени
в конфиге БД я указал что бы не открывал автоматом коннект 'autoConnect' => false
Filsh
Сообщения: 77
Зарегистрирован: 2010.10.17, 11:00
Откуда: Днепропетровск
Контактная информация:

Re: Кеширование ActiveRecords

Сообщение Filsh »

отрубил комп от сети, начал кричать что мускула не найдет :)
как отключить автоконнект? конфигурация такая

Код: Выделить всё

'db' => array(
            'class' => 'application.components.EDbConnectionManager',
            'connectionString' => 'mysql:host='.DB_HOST.';dbname=multi_media',
            'username' => DB_USER,
            'password' => DB_PASS,
            'tablePrefix' => '',
            'charset' => 'utf8',
            'enableProfiling' => YII_DEBUG,
            'enableParamLogging' => YII_DEBUG,
            'schemaCachingDuration' => 3600,
            'autoConnect' => false
        ),
 
Filsh
Сообщения: 77
Зарегистрирован: 2010.10.17, 11:00
Откуда: Днепропетровск
Контактная информация:

Re: Кеширование ActiveRecords

Сообщение Filsh »

блин...
полез в исходники CDbConnection, он открывает соединение на createCommand и прочее...
как то не логично, зачем же открывать базу, а потом смотреть наличие данных в кеше?
теперь прийдеться проверять сначала в кеше, и если нужно создавать модель AR :(
vladimircape
Сообщения: 339
Зарегистрирован: 2012.05.29, 16:31

Re: Кеширование ActiveRecords

Сообщение vladimircape »

Filsh писал(а):все тестирую на домашнем ПК, но mysql удаленный, поэтому без кеша долго
Мемкеш на локальной машине вместе с кодом

интересно то что, такой код работает так

Код: Выделить всё

Yii::beginProfile('UsersInfo');
UsersInfo::model()->cache(3600*24)->findByPk($idUser); // 0.57915
Yii::endProfile('UsersInfo');

Yii::beginProfile('UsersTest');
Users::model()->cache(3600*24)->findByPk($idUser); // 0.00200
Yii::endProfile('UsersTest');
 
он на первое создание AR что то делает, на что тратиться куча времени
в конфиге БД я указал что бы не открывал автоматом коннект 'autoConnect' => false
Вообще-то как я знаю мемкэш на одной машине это зло, используй APC
R3D3
Сообщения: 352
Зарегистрирован: 2010.04.11, 14:52

Re: Кеширование ActiveRecords

Сообщение R3D3 »

Filsh писал(а):
интересно то что, такой код работает так

Код: Выделить всё

Yii::beginProfile('UsersInfo');
UsersInfo::model()->cache(3600*24)->findByPk($idUser); // 0.57915
Yii::endProfile('UsersInfo');

Yii::beginProfile('UsersTest');
Users::model()->cache(3600*24)->findByPk($idUser); // 0.00200
Yii::endProfile('UsersTest');
 
он на первое создание AR что то делает, на что тратиться куча времени
То есть похоже что при первом вызове идет подключение к БД, которое и дает такую задержку. Жаль что yii все таки открывает соединение при создании команды. Видимо это сделано из тех соображений, что все-же кешируется не вся система, а только некоторые ее запросы, и соединение с БД в приложении понадобится в любом случае.
Yii Jabber Conference: yii@conference.jabber.ru
Filsh
Сообщения: 77
Зарегистрирован: 2010.10.17, 11:00
Откуда: Днепропетровск
Контактная информация:

Re: Кеширование ActiveRecords

Сообщение Filsh »

vladimircape писал(а):Вообще-то как я знаю мемкэш на одной машине это зло, используй APC
почему зло?
vladimircape писал(а):То есть похоже что при первом вызове идет подключение к БД
да, в этом вся и проблема, либо кешировать блоки целиком, либо смирится с соединением,
но так как на боевом сервере соединение будет открыватся достаточно быстро, то это не такая уже и большая проблема становится
Ответить