Очистка кэша при использовании xPDOAPCCache
Дано:
При очистке кэша через «Сайт -> Обновить сайт» кэш чистится на обоих сайтах.
Используется cache_handler = cache.xPDOAPCCache, установлен cache_prefix = sitename_
Как разделить кэш доменов, чтобы при очистке только нужный очищался?
- 1 сервер,
- 2 домена,
- MODX 2.2.5,
- php-apc
extension=apc.so
apc.enabled=1
apc.cache_by_default=1
apc.shm_segments=1
apc.shm_size=128M
apc.ttl=3600
apc.user_ttl=7200
apc.gc_ttl=3600
apc.max_file_size=1M
apc.stat=1
Проблема:При очистке кэша через «Сайт -> Обновить сайт» кэш чистится на обоих сайтах.
Используется cache_handler = cache.xPDOAPCCache, установлен cache_prefix = sitename_
Как разделить кэш доменов, чтобы при очистке только нужный очищался?
Комментарии: 7
нашли решение этой проблемы? а то я замучился с этим тоже )
все работает, ничего трогать не надо. убери знак подчеркивания только лишь в префиксе
проблема есть, что с подчеркиванием что без, причем кеш смешивается именно в контексте админ панели, на самом сайте нормально отрабатывает, но при очистке кеш удаляется на всех сайтах. С cache.xPDOMemCache та же история.
а папку core/cache/ чистил после переключения на APC?
там вроде с бубном надо плясать, я уже не припомню, но файлы кэша вручную удаляю при работе с APC — ни одну настройку системную нельзя поменять через обычное «очистить кэш сайта» — в принципе, не напрягает.
там вроде с бубном надо плясать, я уже не припомню, но файлы кэша вручную удаляю при работе с APC — ни одну настройку системную нельзя поменять через обычное «очистить кэш сайта» — в принципе, не напрягает.
да, чистил, не помогает, видимо нужно лесть в класс обработки кеша…
нашел решение проблемы с админ панелью, если вы используете кеширование запросов к базе данных нужно прописать в настройках cache_db_prefix=sitename_ и cache_prefix = sitename_
Итак окончательное решение проблемы:
выставляем в настройках cache_db_prefix=sitename_ и cache_prefix = sitename_
загружаем в /var/www/nwstroy/www/core/xpdo/cache обновленный класс обработчик кеша
меняем настройку cache_handler на cache.xPDOAPCOneFushCache
очищаем папку /var/www/nwstroy/www/core/cache и кеш apc в apc.php
все, теперь при очистке кеш удаляется только на одном из сайтом, с помощью доработанной функции flush в cache.xPDOAPCOneFushCache
выставляем в настройках cache_db_prefix=sitename_ и cache_prefix = sitename_
загружаем в /var/www/nwstroy/www/core/xpdo/cache обновленный класс обработчик кеша
<?php
/*
* Copyright 2010-2013 by MODX, LLC.
*
* This file is part of xPDO.
*
* xPDO is free software; you can redistribute it and/or modify it under the
* terms of the GNU General Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at your option) any later
* version.
*
* xPDO is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
* A PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with
* xPDO; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
* Suite 330, Boston, MA 02111-1307 USA
*/
/**
* Provides an APC-powered xPDOCache implementation.
*
* This requires the APC extension for PHP, version 3.1.4 or later. Earlier versions
* did not have all the necessary user cache methods.
*
* @package xpdo
* @subpackage cache
*/
class xPDOAPCOneFushCache extends xPDOCache
{
public function __construct(& $xpdo, $options = array())
{
parent :: __construct($xpdo, $options);
if (function_exists('apc_exists')) {
$this->initialized = true;
} else {
$this->xpdo->log(xPDO::LOG_LEVEL_ERROR, "xPDOAPCCache[{$this->key]}: Error creating APC cache provider; xPDOAPCCache requires the APC extension for PHP, version 2.0.0 or later.");
}
}
public function add($key, $var, $expire = 0, $options = array())
{
$added = apc_add(
$this->getCacheKey($key),
$var,
$expire
);
return $added;
}
public function set($key, $var, $expire = 0, $options = array())
{
$set = apc_store(
$this->getCacheKey($key),
$var,
$expire
);
return $set;
}
public function replace($key, $var, $expire = 0, $options = array())
{
$replaced = false;
if (apc_exists($key)) {
$replaced = apc_store(
$this->getCacheKey($key),
$var,
$expire
);
}
return $replaced;
}
public function delete($key, $options = array())
{
$deleted = false;
if (!isset($options['multiple_object_delete']) || empty($options['multiple_object_delete'])) {
$deleted = apc_delete($this->getCacheKey($key));
} elseif (class_exists('APCIterator', true)) {
$iterator = new APCIterator('user', '/^' . str_replace('/', '\/', $this->getCacheKey($key)) . '/', APC_ITER_KEY);
if ($iterator) {
$deleted = apc_delete($iterator);
}
}
return $deleted;
}
public function get($key, $options = array())
{
$value = apc_fetch($this->getCacheKey($key));
return $value;
}
public function flush($options = array())
{
$flushed = false;
if (class_exists('APCIterator', true) && $this->getOption('flush_by_key', $options, true) && !empty($this->key)) {
$cache_prefix = $this->getOption('cache_prefix', $options);
if (!empty($cache_prefix)) {
$iterator = new APCIterator('user', '/^' . str_replace('/', '\/', $this->key) . '\/' . str_replace('/', '\/', $cache_prefix) . '/', APC_ITER_KEY);
} else {
$iterator = new APCIterator('user', '/^' . str_replace('/', '\/', $this->key) . '\//', APC_ITER_KEY);
}
if ($iterator) {
$flushed = apc_delete($iterator);
}
} else {
$flushed = apc_clear_cache('user');
}
return $flushed;
}
}
меняем настройку cache_handler на cache.xPDOAPCOneFushCache
очищаем папку /var/www/nwstroy/www/core/cache и кеш apc в apc.php
все, теперь при очистке кеш удаляется только на одном из сайтом, с помощью доработанной функции flush в cache.xPDOAPCOneFushCache
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.