前言
官方商城改版之後,為了提升動态頁面的通路速度,對商城的一些頁面進行了緩存,使其在一定時間之内避免了重複的查詢和編譯。
原理
主要使用了
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
裡的資料太大,以至于壓縮了一遍後,還是很大,于是又壓縮…就這樣,輸出的時候是壓縮後的資料,結果造成了頁面亂碼的問題。
至于解決方案,有兩個:
一、關閉壓縮功能
<?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);
...
複制代碼
二、修改
PHP
配置,修改
Memcache
壓縮門檻值
有則修改,無則添加。
...
[memcached]
memcached.compression_threshold = 1048576
...
複制代碼
修改完成以後,需要重新開機
php-fpm
。
總結
在配置的過程中還算順利,隻是遇到了一個亂碼的問題。也是由于我用的比較簡單,是以很多問題并沒有暴露出來。不積跬步,無以至千裡。加油吧,騷年。
-- EOF --
本文轉載自IMJCW
原文連結:使用Nginx+Memcache做頁面緩存