一、安装memcached模块
默认安装了memcached模块
./configure --prefix=/usr/local/nginx
二、memcached模块主要指令:
(1)memcached_bind:指定要绑定memcached服务器的本地IP地址
用法:memcached_bind IP地址或者off
;
如:
memcached_bind 127.0.0.1;
(2)memcached_buffer_size:设置memcached的缓冲区的大小
用法:memcached_buffer_size 缓冲区大小;
如:
memcached_buffer_size 10k;
(3)memcached_connect_timeout:设置连接memcached服务器的超时时间
用法:memcached_connect_timeout 时间;
如:
memcached_connect_timeout 6s;
(4)memcached_pass:设定memcached服务器的地址
用法:memcached_pass 域名或IP:端口;
如:
memcached_connect_timeout 6s;
(5)memcached_read_timeout:设置memcached读数据超时时间
用法:memcached_read_timeout 时间;
如:
memcached_read_timout 10s;
(6)memcached_send_timeout:设置memcached写数据超时时间
用法:memcached_send_timeout 时间;
如:
memcached_send_timout 10s;
三、memcached产生的变量
- (1)$memcached_key: 定义memcached响应变量
用法:set $memcached_key 变量名;
如:
set $memcached_key $uri;
四、memcached与nginx结合实现网站内容缓存
1、传统网站内容缓存的实现
客户端请求一个地址,nginx服务器把请求转发给php进程,php根据请求中相关的参数先查看memcached服务器中是否缓存了相关数据,如果有,直接读取返回,如果没有,则读取数据库内容,将读取的内容写入memcached缓存,并返回,如图:
2、基于memcached+nginx+php+mysql的内容缓存的实现
客户端请求一个地址,nginx服务器直接连接memcached服务器,查看是否有有该数据,如果有数据则直接返回,如果没有数据,则通过一个错误指向一个php回调处理,php首先查看memcached是否有相关的数据,没有,则读数据库,再把数据库返回的数据返回,并存入到memcached中
3、通过memcached+nginx实现页面缓存:
场景:对于很多门户网站来说,页面静态化是一个很好的方案,但是如果访问某个静态页面它不存在时,该怎么办呢?直接404,貌似不太友好,于是乎,我们在某个页面不存在时,把它转到一个处理的php上,通过php生成静态化,同时把$uri存入到memcached,在下次访问这个静态页面时,可以直接访问html静态页面,不需要再通过php了
- (1)在nginx中配置:
location /html {
set $memcached_key $uri;
memcached_pass 127.0.0.1:11211;
memcached_send_timeout 15s;
memcached_read_timeout 20s;
memcached_buffer_size 64k;
error_page 404 /html.php;
}
再在根目录下建立一个html.php,内容如下:
<?php
var_dump($_GET);
访问http://192.168.0.239/html/user/1.html
发现是个空数组(当然也证明确实跳转到html.php上了),这是为什么呢?因为我们没给这个地址传参。它怎么会怎么呢?所以,我们得给它传个参数
更改nginx配置如下:
location /html {
set $memcached_key $uri;
memcached_pass 127.0.0.1:11211;
memcached_send_timeout 15s;
memcached_read_timeout 20s;
memcached_buffer_size 64k;
error_page 404 /html.php?uri=$uri;
}
保存更新载入配置文件再次访问发现有数据了:
array(1) {
["uri"]=>
string(17) "/html/user/1.html"
}
因此我们在php中通过分析uri来做相关操作:
把从数据库中读取的信息,与模板整合,把整合后的信息存入到memcached中,并以uri为键
<?php
header('content-type:text/html;charset=utf-8');
$uri = isset($_GET['uri']) ? trim($_GET['uri']) : '';
if(($uri != '') && file_exists($uri))
{
header('Location:'.$uri);
}
else{
$urlArray = explode('/', trim($uri, '/'));
$model = isset($urlArray[1]) ? $urlArray[1] : '';
$uid = isset($urlArray[2]) ? (int)str_replace('.html', '', $urlArray[2]) : 0;
$memcache = new Memcache();
$memcache->addServer('127.0.0.1',11211);
$userInfo = $memcache->get($uri);
if($userInfo)
{
exit($userInfo);
}
else{
$pdo = new Pdo('mysql:host=127.0.0.1;dbname=test;charset=utf8','root', '123456');
$result = $pdo->query('SELECT * FROM users where uid='.$uid);
$row = $result->fetch();
if($row)
{
$userInfo = $row;
$htmlTpl = '<meta http-equiv="content-type" content="text/html;charset=utf-8"/><title>用户'.$userInfo['nickname'].'的主页</title><body><h2>'.$userInfo['nickname'].'的主页</h2><p>个人信息:注册IP:'.$userInfo['ip'].'<br/>,注册地:'.$userInfo['location'].'<br/>登录次数:'.$userInfo['login_times'].'</p></body>';
//如果使用模板引擎可以不用这以,直接把变量输出到模板即可
$memcache->set($uri, $htmlTpl);
echo $htmlTpl;
}
else{
echo '用户不存在';
}
}
}
我们首次访问查看:
发现是php的输出
再次刷新访问查看:
因此,通过memcached+nginx可以实现直接从缓存中读取页面信息