Используйте Nginx+Memcache для кэширования страниц

PHP Nginx Memcached

предисловие

После доработки официального молла, для повышения скорости доступа к динамическим страницам, некоторые страницы молла кэшируются, чтобы избежать повторного запроса и компиляции в течение определенного периода времени.

принцип

в основном используетсяnginxизmemcached_moduleмодуль, непосредственно изMemcacheчтение и вывод с сервера.

Если он не существует, выполните соответствующую программу и запишите результат вMemcahce.

Структурная схема:

使用Memcached做页面缓存结构图

Основной процесс:

Поступают запросы пользователей,NginxВ направленииMemcacheПолучите данные и в случае успеха верните их непосредственно в службу поддержки клиентов. Если не получится, тоNginxбудет сообщеноnot foundошибка, на этот раз, нужноrewirteЗапустите соответствующее приложение и напишите результат после завершения рендеринга страницы.Memcache. Тогда следующий запрос будет напрямую отMemcacheПолучать.

Выполнение

Конфигурация Nginx

upstream memcacheds {
    server 127.0.0.1:11211;
}
server {
    ... # 这里的配置不变
    location @rewrite {
        rewrite ^/(.*)$ /index.php?/$1 last;
    }
    set $memcached_key 0; # 初始化一下$memcached_key
    location ~ /(articles)  {
        set $memcached_key $host$uri; # 用url作为标识
        add_header X-IMJCW-Key $memcached_key; # 加到header里,方便管理
        default_type text/html;
        memcached_connect_timeout 1s;
        memcached_read_timeout 2s;
        memcached_send_timeout 2s;
        memcached_pass  memcacheds;
        memcached_gzip_flag 2;
        error_page 404 502 504 = @rewrite;
    }
    ... # 这里的配置不变
    location ~ \.php$ {
        ... # 这里的配置不变
        fastcgi_param X-MEMCACHE-KEY $memcached_key; # 设置参数,为程序是否需要缓存页面做判断
        ... # 这里的配置不变
    }
    ... # 这里的配置不变
}

PHP-код

<?php
// 初始化一下 HTML,这里就不动态生成了
$html = 'Hello World';
// 因为缓存的是页面,所以判断一下请求方式是否是 GET
// 同时判断 $_SERVER 里是否存在 X-MEMCACHE-KEY,并且不为空
if ($_SERVER['REQUEST_METHOD'] != 'GET' || !isset($_SERVER['X-MEMCACHE-KEY']) || !$_SERVER['X-MEMCACHE-KEY']) {
    echo $html;
    exit();
}
// 获取 X-MEMCACHE-KEY
$memcachedKey = $_SERVER['X-MEMCACHE-KEY'];
// 连接 Memcached
$memcached = new \Memcached();
$memcached->addServer('127.0.0.1', '11211', false);
// 存储
$memcached->set($memcachedKey, $html);
// 留个证据
header('X-IMJCW: miss');
header('X-IMJCW-Key: ' . $xMemcacheKey);
echo $html;

Пример

Tips:Пример здесь не выводится вышеприведенным выполнением кода, логика такая же.

Первый визит на страницу:

第一次访问页面

Вторая страница доступа:

第二次访问页面

Проблема с искажением вывода страницы

В практических приложениях я обнаружил, что эффект не так хорош, как я себе представлял, основная причина в том, что вывод страницы искажен.

После различных исследований и консультаций с коллегами окончательный вывод таков:

из-за хранения вMemcacheДанные в нем настолько велики, что после однократного сжатия они все еще очень велики, поэтому они снова сжимаются... Таким образом, на выходе получаются сжатые данные, что приводит к проблеме искаженных страниц.

Что касается решений, то их два:

1. Отключите функцию сжатия

<?php
...
// 获取 X-MEMCACHE-KEY
$memcachedKey = $_SERVER['X-MEMCACHE-KEY'];
// 连接 Memcached
$memcached = new \Memcached();
$memcached->addServer('127.0.0.1', '11211', false);
$memcached->setOption(\Memcached::OPT_COMPRESSION, false);
// 存储
$memcached->set($memcachedKey, $html);
...

2. ИзменитьPHPнастроить, изменитьMemcacheпорог сжатия

Если есть, то он будет изменен, если нет, то будет добавлен.

...
[memcached]
memcached.compression_threshold = 1048576
...

После завершения модификации требуется перезагрузкаphp-fpm.

Суммировать

Процесс настройки прошел успешно, но я столкнулся с проблемой искажения. Это также потому, что я использую его относительно просто, поэтому многие проблемы не выявляются. Если вы не сделаете несколько шагов, вы не сможете пройти тысячу миль. Давай, Сан Нянь.

-- EOF --

Эта статья воспроизведена изIMJCW

Оригинальная ссылка:Используйте Nginx+Memcache для кэширования страниц