предисловие
После доработки официального молла, для повышения скорости доступа к динамическим страницам, некоторые страницы молла кэшируются, чтобы избежать повторного запроса и компиляции в течение определенного периода времени.
принцип
в основном используетсяnginx
изmemcached_module
модуль, непосредственно изMemcache
чтение и вывод с сервера.
Если он не существует, выполните соответствующую программу и запишите результат вMemcahce
.
Структурная схема:
Основной процесс:
Поступают запросы пользователей,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 для кэширования страниц