Включаем MemCache

MemCahed — это замечательная технология, которая позволяет кэшировать данные не на жесткий диск, а в оперативную память, которая быстрее во много-много раз. И если раньше MODX нужно было дружить с ней, то с версии 2.1 работа с MemCache уже включена в движок, и это нужно только активировать.

В принципе, операция не сложная, но есть один момент, из-за которого я и пишу этот топик.

Все операции, как обычно, написаны для сервера настроенного по этой инструкции.
Установка
Устанавливаем нужные пакеты:
sudo apt-get install memcached php5-memcache libmemcached-tools
Перезагружаем php5-fpm
sudo service php5-fpm restart
И на всякий случай memcached
sudo service memcached restart
Делаем phpinfo(), там должно быть видно, что memcache подключен.

Для нагруженных проектов еще можно задать оперативки побольше в /etc/memcached.conf.
Настройка MODX
Идем в системные настройки, находим cache_handler и ставим значение cache.xPDOMemCache.

И вроде бы все, как говорит нам rtfm. Да вот только если у вас на сервере больше одного сайта, и вы на них включили MemCache — начнутся зверские глюки. По умолчанию закэшированные данные от одного сайта будут выдаваться на всех.

Это происходит оттого, что MODX кэширует данные с одними и теми же ключами для разных сайтов. На форуме я решения не нашел, на rtfm тоже и тогда полез читать исходники.

Решение оказалось простым — нужно создать новый системный параметр cache_prefix, и вписать в него любую уникальную строку, чтобы разделить ключи кэша для разных сайтов. Авторы это предусмотрели, но не документировали.


Проверка
Смотрим в консоле статистику, обращаем внимание на get_hits и get_misses:
memcstat --server=127.0.0.1
Еще прикольно почистить у сайтов /core/cache/ и увидеть, что файлов с ресурсами там больше не появляется. Теперь они все в оперативной памяти.

Заключение
Лично я на своих маленьких проектах особой скорости не заметил, зато получил экономию денег на оплате операций чтения\записи жесткого диска на облаке Selectel. А также теперь объем бэкапов будет поменьше — ибо файлов кэша почти нет.
Василий Наумкин
26 августа 2015, 04:58
modx.pro
8
12 097
0

Комментарии: 32

Павел Дедовец
01 ноября 2012, 12:51
0
Приветствую! На вашем сайте на странице «Работа с кэшерами в Revolution» написано следующее
«cache.xPDOMemCached — об­ра­бот­чик для memcached. Есть за­мет­ка про него
cache.xPDOMemCache — об­ра­бот­чик для memcache.»
В этой же статье вы устанавливаете MemCahed значит в конфигах нужно прописывать cache.xPDOMemCached, а вы же написали «ста­вим зна­че­ние cache.xPDOMemCache». Кто ошибся?
Если я то объясните почему, если не сложно. Спасибо.
    Василий Наумкин
    01 ноября 2012, 12:57
    0
    Не объясню, ибо сам не понимаю между ними разницы.

    Используйте лучше php-apc =)
      Павел Дедовец
      01 ноября 2012, 13:11
      0
      Тогда еще один вопрос. Если на сайте стоит стандартная система кэширования в файлы, весь кэш весит к примеру 2 гб. а я хочу что бы кэшировалось в память, то чем лучше пользоваться MemCahed или php-apc? (сервер мощный).
        Василий Наумкин
        01 ноября 2012, 13:18
        0
        Вот честно, не знаю. Одно могу сказать, что php-apc кэширует компилированный php, экономя этим память, а memcache — нет.

        Потестируйте и то и другое, а потом расскажите нам =)
    Alexei Garmash
    19 декабря 2012, 20:35
    0
    Здравствуйте!
    Жаль, что не напал на серию Ваших мануалов раньше.
    Решил поднять сайт на Revo без Apache на VPS от Hetzner.
    Собирал Nginx, php-fpm, MySQL, Memcached, но по другому мануалу и сейчас имею проблемы с кешированием.

    В связи с этим мой вопрос: при подключении memcached в Modx, обязательно ли менять настройки в php.ini с тех, что стоят по-умолчанию:

    session.save_handler = files
    ; session.save_path = «N;/path»

    на, к примеру, вот такие (найденные на просторах интернета):

    session.save_handler = memcache
    ; change server:port to fit your needs…
    session.save_path=«tcp://127.0.0.1:11211?persistent=1&weight=1&timeout=1&retry_interval=15»

    Извините, что издалека.
      Василий Наумкин
      19 декабря 2012, 20:37
      0
      Ничего не нужно, Revolution работает с сессией и кэшем самостоятельно.
        Alexei Garmash
        19 декабря 2012, 21:45
        0
        Василий, спасибо за ответ.
        Попробовал применить — проблема оказалась не в этом.

        Буду очень Вам благодарен, если сможете натолкнуть на мысль:
        есть сайт qbk.com.ua/
        работает на сервере, сконфигурированном по мануалу howitmake.ru/blog/ubuntu/80.html (все кроме виртуального хоста, он адаптирован под MODx).

        Есть основная проблема с работой сессии: товары могут сами выпадать из корзины при переходе на другую страницу, залогиненный пользователь не может разлогиниться.

        Кроме того, в админке не хочет работать TinyMce (не уверен, что это как-то взаимосвязано).

        Что MODx может не нравиться?

        PS я понимаю, что не очень красиво такое спрашивать, т.к. использовал не Ваш мануал и скрипт магазина. Как я уже говорил, немного поздно нашел Ваш блог.
          Василий Наумкин
          19 декабря 2012, 21:52
          0
          На 99% уверен в том, что вы используете ускоритель php на сервере и не выставили верный кэшер.

          Если все выставлено как надо — попробуйте просто отключить memcache\php-apc. Если проблема исчезнет — крутите настройки хостинга.
      Володя
      28 марта 2013, 01:38
      0
      выставил обработчик cache.xPDOMemCached и возник вопрос:
      а куда phpthumbof будет кешировать картинки?
      и как теперь вообще этот кеш из памяти удалить? Очистить кеш сайта не помогает… во встрял)
        Володя
        28 марта 2013, 01:57
        0
        кеш гронул — параметры обратно вернул, вроде все наладилось.
        так где храниться кеш картинок — тоже в памяти?
          Sadykh Sadykhov
          28 марта 2013, 09:33
          0
          Кэш ресурсов храниться в памяти, да и не все настройки хранятся в кэше памяти, некоторые остаются в папке /core/cache.
            Володя
            28 марта 2013, 09:42
            0
            почитал статью, стало интересно(на timeweb включен memcache). вот решил попробовать, грузиться стало быстрее, только одно но — там где обработчиком для картинок стоит phpthumbof изображений нет.
            и даже если внести изменения в ресурс, то страница все равно грузиться из кеша.
            так как мне заставить ее обновиться? какое время храниться этот кеш? как его очистить? Вообще нужна эта затея на шаред хостинге
            спасибо!
              Sadykh Sadykhov
              28 марта 2013, 09:45
              0
              Не знаю, шаред хостингами уже более двух лет не пользуюсь =)
              После того, как установили обработчик, создали префикс, заходите в папку /core/cache и удаляете всё содержимое. А затем, в админке «очисить кэш».

              У меня с php-apc всё молниеносно грузится.
                Володя
                28 марта 2013, 09:53
                0
                спасибо! грохнуть кеш после изменения параметра я и забыл! сейчас все заработало… посмотрю будет ли толк.
                Толька не будет на шареде — глянул нагрузку свою она у меня за 50 cp уже вылезает/ отключат щас нафик
                  Sadykh Sadykhov
                  28 марта 2013, 10:02
                  0
                  Знаете, для чего используется кэш? На больших нагрузках ощутите всю прелесть. А шаред хостинги — ну не понимаю, зачем они нужны =)
                    Володя
                    28 марта 2013, 10:17
                    0
                    да мне пока с познавательной целью, ради интереса / подскажите еще как загрузку памяти посмотреть?
                      Sadykh Sadykhov
                      28 марта 2013, 10:33
                      0
                      Зависит от ОС. Это информации в интернете полно, гугл в помощь :)
                        Володя
                        28 марта 2013, 11:24
                        0
                        мне загрузку увидеть как допустим на этой странице, если я снипет вот такой вызову я правильно увижу потребление памяти?
                        function getStatus($text = '') {
                            global $memory_start;
                            static $microtime_start = null;
                            
                            if ($microtime_start === null) {$time = 0;}
                            else {$time = microtime(true) - $microtime_start;}
                        
                            $memory = memory_get_usage();
                            if (!empty($memory_start)) {
                                $memory2 = number_format(($memory - $memory_start) / 1024, 2,","," ");
                                $memory2 = " ($memory2 Кб.)";
                            } else {$memory2 = '';}
                            $memory = number_format($memory / 1024, 2,","," ");
                            
                            echo $text.'
                        memory: '.$memory.' Кб.'.$memory2.'
                        
                        ';
                            
                            $microtime_start = microtime(true);
                        }
                        
                        $modx->getService('error','error.modError');
                        $modx->setLogLevel(modX::LOG_LEVEL_INFO);
                        $modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML');
                        getStatus('');
                        
                        $memory_start = memory_get_usage();
                          Володя
                          29 марта 2013, 09:15
                          0
                          выставил cache.xPDOAPCCache — потребление памяти упало процентов на 30, сайт стал пошустрее…
                          подскажите по времени хранения кеша? например все ресурсы я закешировал вчера, сегодня захожу на сайт а он не из кеша грузит… Где задать вот это время жизни кеша?
      Володя
      22 августа 2013, 09:03
      0
      Привет! Парни а кто нибудь пробовал nginx забирать страницы из memcache?
      Он ведь позволяет это делать через set $memcached_key.
      Подскажите в каком формате формирует ключ modx для memcache? или где это можно посмотреть?
        Володя
        22 августа 2013, 09:59
        0
        public function set($key, $var, $expire= 0, $options= array()) {
                $set= $this->memcached->set(
                    $this->getCacheKey($key),
                    $var,
                    $expire
                );
                return $set;
            }
        я так понимаю вот этот блок ключ задает?
          Володя
          22 августа 2013, 10:50
          0
          resource/cache_prefix_context/resources/id
          но тут помимо html еще что то отдает и в итоге не страница а мусор(
          Василий Наумкин
          22 августа 2013, 13:42
          0
          Зачем?

          Есть специальные решения, когда страницы сохраняются в html, например вот StatCache.
            Володя
            22 августа 2013, 16:24
            0
            не знал про такой плагин, но он просто для nginx складывает кэшированные страницы в определенной папке и все.
            чисто для статики очень неплохо.
            с memcache же можно время жизни для странички задать, ну и вообще это уже не совсем статика будет…
              Василий Наумкин
              22 августа 2013, 16:41
              0
              Ну а тут-то, конечно, никак нельзя страницы обновлять. Один раз положил — и навсегда, пока сервер не сломается.

              Удачи в ковыряниях.
          Алексей Соин
          15 ноября 2016, 08:22
          0
          что с сайтом??? joxi.ru/Y2L6nKnu9wG7dr
            Василий Наумкин
            15 ноября 2016, 08:32
            0
            Многие заметки изначально были написаны на bezumkin.ru, и перенесены сюда вместе с датами и комментариями.

            Так что, с сайтом всё в порядке.
              Алексей Соин
              15 ноября 2016, 08:40
              0
              Не, я про то что на всех страницах были новости не новее 2012 года, сейчас вроде всё норм, а вот на сайте file.modx.pro/ и сейчас какойто глюк, авторизоваться нельзя
                Василий Наумкин
                15 ноября 2016, 08:43
                0
                Видимо, из-за срочных обновлений MODX. Я сейчас везде ставлю свежий pdoTools.

                Авторизацию сейчас поправлю.
            Андрей Степаненко
            23 января 2019, 17:25
            0
            Проблема обнаружилась сегодня, точнее она и раньше переодически возникала, но на этом все и останавливалось.
            В общем на сайте используется MemCache не знаю на сколько именно в нем проблема, но думаю что из за него:
            Вносишь изменения в файл через редактор modx а оно не применяется. После попыток отчистить кэш, нескольких попыток изменить файл, обновить страницу и всяческие другие операции изменение может примениться а может и нет.
            То есть не понятно когда применяется изменения а когда нет. В файле то все меняется, но отдается старая версия файла при запросе к нему.

            Возможно кто подскажет есть какое то решение?
              Евгений
              04 ноября 2020, 21:51
              0
              Есть такое
              1Mb cache entry limitation
              Most cache entries in MODX will never get this large. But if you have tens of thousands of Resources, you may want to exclude Context Settings from using memcached, because if your Context cache entry is larger than 1Mb, it will not be cached at all, and will be loaded from the database on each request. Similar could occur with very large cacheable Resources or huge database result sets. It's not something that will affect many, but those with very large MODX sites should definitely be aware of the possibility.
              у меня похоже эта ситуация, в связи с чем подскажите как исключить Context Settings из memcached в сторону файлового кэша например
                Сергій
                04 сентября 2021, 05:21
                0
                @Василий Наумкин Добрый день. Подскажите, не знаете ли вы как подключить сайт к redis.
                  Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                  32