nginx中memcached模块

一、安装memcached模块

默认安装了memcached模块

  1. ./configure --prefix=/usr/local/nginx

二、memcached模块主要指令:

(1)memcached_bind:指定要绑定memcached服务器的本地IP地址

用法:memcached_bind IP地址或者off;

如:

  1. memcached_bind 127.0.0.1;
(2)memcached_buffer_size:设置memcached的缓冲区的大小

用法:memcached_buffer_size 缓冲区大小;

如:

  1. memcached_buffer_size 10k;
(3)memcached_connect_timeout:设置连接memcached服务器的超时时间

用法:memcached_connect_timeout 时间;

如:

  1. memcached_connect_timeout 6s;
(4)memcached_pass:设定memcached服务器的地址

用法:memcached_pass 域名或IP:端口;

如:

  1. memcached_connect_timeout 6s;
(5)memcached_read_timeout:设置memcached读数据超时时间

用法:memcached_read_timeout 时间;

如:

  1. memcached_read_timout 10s;
(6)memcached_send_timeout:设置memcached写数据超时时间

用法:memcached_send_timeout 时间;

如:

  1. memcached_send_timout 10s;

三、memcached产生的变量

  • (1)$memcached_key: 定义memcached响应变量

用法:set $memcached_key 变量名;

如:

  1. 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中配置:
  1. location /html {
  2. set $memcached_key $uri;
  3. memcached_pass 127.0.0.1:11211;
  4. memcached_send_timeout 15s;
  5. memcached_read_timeout 20s;
  6. memcached_buffer_size 64k;
  7. error_page 404 /html.php;
  8. }

再在根目录下建立一个html.php,内容如下:

  1. <?php
  2. var_dump($_GET);

访问http://192.168.0.239/html/user/1.html

发现是个空数组(当然也证明确实跳转到html.php上了),这是为什么呢?因为我们没给这个地址传参。它怎么会怎么呢?所以,我们得给它传个参数

更改nginx配置如下:

  1. location /html {
  2. set $memcached_key $uri;
  3. memcached_pass 127.0.0.1:11211;
  4. memcached_send_timeout 15s;
  5. memcached_read_timeout 20s;
  6. memcached_buffer_size 64k;
  7. error_page 404 /html.php?uri=$uri;
  8. }

保存更新载入配置文件再次访问发现有数据了:

  1. array(1) {
  2. ["uri"]=>
  3. string(17) "/html/user/1.html"
  4. }

因此我们在php中通过分析uri来做相关操作:

把从数据库中读取的信息,与模板整合,把整合后的信息存入到memcached中,并以uri为键

  1. <?php
  2. header('content-type:text/html;charset=utf-8');
  3. $uri = isset($_GET['uri']) ? trim($_GET['uri']) : '';
  4. if(($uri != '') && file_exists($uri))
  5. {
  6. header('Location:'.$uri);
  7. }
  8. else{
  9. $urlArray = explode('/', trim($uri, '/'));
  10. $model = isset($urlArray[1]) ? $urlArray[1] : '';
  11. $uid = isset($urlArray[2]) ? (int)str_replace('.html', '', $urlArray[2]) : 0;
  12. $memcache = new Memcache();
  13. $memcache->addServer('127.0.0.1',11211);
  14. $userInfo = $memcache->get($uri);
  15. if($userInfo)
  16. {
  17. exit($userInfo);
  18. }
  19. else{
  20. $pdo = new Pdo('mysql:host=127.0.0.1;dbname=test;charset=utf8','root', '123456');
  21. $result = $pdo->query('SELECT * FROM users where uid='.$uid);
  22. $row = $result->fetch();
  23. if($row)
  24. {
  25. $userInfo = $row;
  26. $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>';
  27. //如果使用模板引擎可以不用这以,直接把变量输出到模板即可
  28. $memcache->set($uri, $htmlTpl);
  29. echo $htmlTpl;
  30. }
  31. else{
  32. echo '用户不存在';
  33. }
  34. }
  35. }

我们首次访问查看:

发现是php的输出

再次刷新访问查看:

因此,通过memcached+nginx可以实现直接从缓存中读取页面信息