Кеширование схемы БД в memcache

Уже исправленные репорты или принятые предложения
Ответить
MuratYMT
Сообщения: 20
Зарегистрирован: 2015.03.16, 09:34

Кеширование схемы БД в memcache

Сообщение MuratYMT » 2016.11.04, 07:33

Никто не сталкивался с таким?
Если в настройках указать файловый кеш

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

'cache' => [
            'class' => 'yii\caching\FileCache',
            'keyPrefix' => $_SERVER['HTTP_HOST'],
        ],
то кеширование схемы работает. Если же заменить на мемкеш

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

'cache' => [
            'class' => 'yii\caching\MemCache',
            'keyPrefix' => $_SERVER['HTTP_HOST'],
            'servers' => [
                ['host' => '127.0.0.1', 'port' => 11211],
            ]
        ],
то схема никак не кешируется. При этом обычные запросы к БД кешируются в обоих случая.
Настройка соеденения с БД

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

 'class' => 'isr2\components\db\Connection',
    'dsn' => 'pgsql:host=localhost;dbname=******',
    'username' => 'postgres',
    'password' => '*********',
    'charset' => 'utf8',
    'enableSchemaCache' => true,
Windows 7, PHP 7.0.12, Yii2 2.0.9

Аватара пользователя
samdark
Администратор
Сообщения: 8552
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Кеширование схемы БД в memcache

Сообщение samdark » 2016.11.04, 12:20

Мемкеш рабочий?

MuratYMT
Сообщения: 20
Зарегистрирован: 2015.03.16, 09:34

Re: Кеширование схемы БД в memcache

Сообщение MuratYMT » 2016.11.04, 14:21

Да. Перепроверил следующим кодом

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

$cache = new Memcache();
$cache->connect('localhost', 11211);
$cache->set('zser', 1456);

$value = $cache->get('zser');
var_dump($value); 
В выводе

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

int(1456)
В процессе проверки оказалось, что запросы к базе вобще не кешируются.

MuratYMT
Сообщения: 20
Зарегистрирован: 2015.03.16, 09:34

Re: Кеширование схемы БД в memcache

Сообщение MuratYMT » 2016.11.04, 14:39

Еще интересная особенность. Если данные напрямую положить в кеш

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

$cache = new Memcache();
$cache->connect('localhost', 11211);
$cache->set('e81cade9fb23193dacfff08621e2ad9c', '****');
То затем в Yii кеш эти данные находит.

MuratYMT
Сообщения: 20
Зарегистрирован: 2015.03.16, 09:34

Re: Кеширование схемы БД в memcache

Сообщение MuratYMT » 2016.11.04, 15:10

Вобщем если это место в yii\caching\MemCache

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

protected function setValue($key, $value, $duration)
    {
        $duration = $this->trimDuration($duration);
        $expire = $duration > 0 ? $duration + time() : 0;

        return $this->useMemcached ? $this->_cache->set($key, $value, $expire) : $this->_cache->set($key, $value, 0, $expire);
    }
 
заменить на

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

protected function setValue($key, $value, $duration)
    {
        $duration = $this->trimDuration($duration);

        return $this->useMemcached ? $this->_cache->set($key, $value, $duration) : $this->_cache->set($key, $value, 0, $duration);
    }
Все работает на ура

MuratYMT
Сообщения: 20
Зарегистрирован: 2015.03.16, 09:34

Re: Кеширование схемы БД в memcache

Сообщение MuratYMT » 2016.11.04, 15:37

Вобщем разобрался. Проблема в сервере мемкеша.
До версии 1.4.5 видимо Memcache понимал только сколько секунд хранить и все что больше 30 дней отбрасывал. У меня как раз и стоит версия 1.4.4
С версии 1.4.5 добавили возможность задать либо юникс тайм либо время жизни. В ней все работает корректно.
Тему можно закрывать

Ответить