memcached

Какое кэширование вы используете?

Не использую кэширование
Files
Memcached
Всего 6 голосов Опрос завершён
#1 16 июня 2015 в 23:29
решил попробовать кэширование через memcached
поставил memcached на сервер, выставил соответствующие настройки в CMS
на сервере крутятся 2 сайта на базе ICMS 2
в итоге получилось что оба сайта стали одинаковыми
такое ощущение, что один закэшировался, а второй подтягивает кэш от первого
это у меня сервере что-то неправильно или это баг в CMS?
#2 17 июня 2015 в 08:30
Класс, не пробовал так))) А народ мучается как два сайта с одной базой связать ))))) Включите КЭШ!!!
#3 17 июня 2015 в 11:05


Класс, не пробовал так))) А народ мучается как два сайта с одной базой связать ))))) Включите КЭШ!!!

PIN

для чистоты эксперимента хорошо бы повторить подобное тестирование на другом сервере
#4 19 июня 2015 в 10:01
Параметр MEMCACHE_NAMESPACE нужен для варианта когда одним сервером memcached будут пользоваться разные сайты — для разделения их кэшей.
Не смотрел, как это реализовано в двойке, у меня так, может пригодится:


define('CACHE_DRIVER', 'memcached');
define('MEMCACHE_HOSTNAME', 'localhost');
define('MEMCACHE_PORT', '11211');
define('MEMCACHE_NAMESPACE', 'site123');


<?php
final class Cache {
private $expire;
private $memcache;
private $ismemcache = false;

public function __construct($exp = 3600) {
$this->expire = $exp;

if (CACHE_DRIVER == 'memcached')
{
$mc = new Memcache;
if ($mc->pconnect(MEMCACHE_HOSTNAME, MEMCACHE_PORT))
{
$this->memcache = $mc;
$this->ismemcache = true;
};
};

if (!$this->ismemcache)
{
$files = glob(DIR_CACHE. 'cache.*');

if ($files) {
foreach ($files as $file) {
$time = substr(strrchr($file, '.'), 1);

if ($time < time()) {
if (file_exists($file)) {
@unlink($file);
}
}
}
}
}
}

public function get($key) {
if ((CACHE_DRIVER == 'memcached') && $this->ismemcache)
{
return($this->memcache->get(MEMCACHE_NAMESPACE. $key, 0));
}
else
{
$files = glob(DIR_CACHE. 'cache.'. $key. '.*');

if ($files) {
foreach ($files as $file) {
$cache = '';

$handle = fopen($file, 'r');

if ($handle) {
$cache = fread($handle, filesize($file));

fclose($handle);
}

return unserialize($cache);
}
}
}
}

public function set($key, $value) {
if ((CACHE_DRIVER == 'memcached') && $this->ismemcache)
{
$this->memcache->set(MEMCACHE_NAMESPACE. $key, $value, 0, $this->expire);
}
else
{

$this->delete($key);

$file = DIR_CACHE. 'cache.'. $key. '.'. (time() + $this->expire);

$handle = fopen($file, 'w');

fwrite($handle, serialize($value));

fclose($handle);
};
}

public function delete($key) {
if ((CACHE_DRIVER == 'memcached') && $this->ismemcache)
{
$this->memcache->delete(MEMCACHE_NAMESPACE. $key);
}
else
{
$files = glob(DIR_CACHE. 'cache.'. $key. '.*');

if ($files) {
foreach ($files as $file) {
if (file_exists($file)) {
@unlink($file);
clearstatcache();
}
}
}
}
}
}
?>
#5 19 июня 2015 в 10:29
glutezneff, а что это за файл? как называется?
#6 19 июня 2015 в 10:39


glutezneff, а что это за файл? как называется?

Timmy
Поищите подобное в двойке, это другая кмс
#7 19 июня 2015 в 10:44
glutezneff, понял, спасибо.
#8 19 июня 2015 в 13:31
А в чем разница между методами, дайте ссылку почитать на досуге…
#9 19 июня 2015 в 16:22
нашел файл /system/core/cachememory.php
вот только нифига не понимаю что в нем править нужно...

  1. <?php
  2. class cmsCacheMemory {
  3.  
  4. private $memcache;
  5.  
  6. public function set($key, $value, $ttl){
  7.  
  8. list($ns, $key) = $this->getNamespaceAndKey($key);
  9.  
  10. $ns_value = $this->getNamespaceValue($ns);
  11.  
  12. $key = implode('.', array($ns_value, $ns, $key));
  13.  
  14. return $this->memcache->set($key, serialize($value), false, $ttl);
  15.  
  16. }
  17.  
  18. public function has($key){
  19. return true;
  20. }
  21.  
  22. public function get($key){
  23.  
  24. list($ns, $key) = $this->getNamespaceAndKey($key);
  25.  
  26. $ns_value = $this->getNamespaceValue($ns);
  27.  
  28. $key = implode('.', array($ns_value, $ns, $key));
  29.  
  30. $value = $this->memcache->get($key);
  31.  
  32. if (!$value) { return false; }
  33.  
  34. return unserialize($value);
  35.  
  36. }
  37.  
  38. public function clean($ns=false){
  39.  
  40. if ($ns){
  41.  
  42. return $this->memcache->increment("namespace:{$ns}");
  43.  
  44. } else {
  45.  
  46. return $this->memcache->flush();
  47.  
  48. }
  49.  
  50. }
  51.  
  52. public function start(){
  53. $config = cmsConfig::getInstance();
  54. $this->memcache = new Memcache;
  55. $this->memcache->connect($config->cache_host, $config->cache_port) or die('Memcache connect error');
  56. return true;
  57. }
  58.  
  59.  
  60. public function stop(){
  61. $this->memcache->close();
  62. return true;
  63. }
  64.  
  65. private function getNamespaceAndKey($key){
  66.  
  67. $ns = str_replace('.', '/', $key);
  68. $key = explode('/', $ns);
  69.  
  70. $ns = dirname($ns);
  71. $key = $key[sizeof($key)-1];
  72.  
  73. $ns = str_replace('/', '.', $ns);
  74.  
  75. return array($ns, $key);
  76.  
  77. }
  78.  
  79. private function getNamespaceValue($ns){
  80.  
  81. $ns_value = $this->memcache->get("namespace:{$ns}");
  82.  
  83. if($ns_value===false) {
  84. $ns_value = 1;
  85. $this->memcache->set("namespace:{$ns}", $ns_value, false, 86400);
  86. }
  87.  
  88. return $ns_value;
  89.  
  90. }
  91.  
  92. }
  93.  
#10 19 июня 2015 в 19:08
Timmy, попробуйте на одном сайте поменять в этом файле все namespace: на namespace1:, а на другом сайте на namespace2:.
Сначала чтобы просто проверить, что заработает как надо.

там всего три вхождения "namespace:", их и надо заменить.
#11 20 июня 2015 в 00:58
SJen, заменил. не помогло.
#12 22 июня 2015 в 06:08

заменил. не помогло.

Timmy
А кэш очистили после этого?
давайте про конфиг? что включено? все ли по дефолту? сервак самосбор или что?
#13 22 июня 2015 в 10:43
бывает такое из-за не правильно настроенного apc, какая версия php на сервере?
#14 22 июня 2015 в 12:25


заменил. не помогло.

Timmy
А кэш очистили после этого?
давайте про конфиг? что включено? все ли по дефолту? сервак самосбор или что?

kirkr

кэш очистил
какой именно конфиг?
почти все по дефолту
серввер — Debian Wheezy (64) + ISP Manager Lite
#15 23 июня 2015 в 10:52
заменил cachememory на указанный вами, — заработало!
Спасибо!

Разместив в файле index в самом низу код

Геннадий Иванович
а зачем это нужно? поясните пожалуйста.
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.