在配置所有的memcached应用之前必须先准备LNMP环境(这里不再赘述LNMP的搭建)

第一种应用场景:

php的memcache扩展介绍:

            php有两个memcache的扩展: php memcache 和 php memcached。 php memcache独立用php实现,是老版客户端,从我们实践中已发现有多个问题,而且功能少,属性也可设置的少;php memcached是基于原生的c的libmemcached的扩展,更加完善,建议替换为php memcached。

php memcache 扩展的缺点:

1.分布式问题

           php memcache默认会自动切换实例,所以有时取到老数据,并且value飘忽不定。

2.高并发下稳定性问题

           php memcache换成php memcached,在高并发下稳定下极大提高;

3.秒超时间隔没法修改问题

           php memcache客户端有个1秒超时间隔没法修改问题:bool Memcache::connect ( string $host [, int $port [, int $timeout ]] )第三个参数本来可设置timeout,单位秒,但无法修改。

测试了以下三种修改timeout的方法都无效:

           用memcache api Memcache::setServerParams不能修改。

           改memcache 源代码vi php_memcache.h宏定义不能修改。

           php.ini内这个配置:default_socket_timeout = 60对本timeout无效。

4.php memcache这个老客户端在属性设置方面可设置的很少,出错码粒度很粗,出错后难以定位,而且功能欠缺一些。


安装php的memcached扩展:

1.安装libmemcached(memcached的库)

           # tar -xf libmemcached-1.0.16.tar.gz 

           # cd libmemcached-1.0.16

           # ./configure  --prefix=/usr/local/libmemcached --with-memcached 

           # make && make install

2.安装php memcached扩展        

           # tar -xf memcached-2.2.5.tgz

           # cd memcached-2.2.5

           # /usr/local/php/bin/phpize

           # . /configure --with-php-config=/usr/local/php/bin/php-config --enable-memcache  --with-libmemcached-dir=/usr/local/libmemcached   --disable-memcached-sasl

           # make && make install

3.在/etc/php.d/目录下创建php memcached扩展的配置文件

           # vim /etc/php.d/memcached.ini

                    extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/memcached.so

           # service php-fpm restart

4.而后对memcached功能进行测试,在网站根目录下建立测试页面test.php,添加如下内容:

<?php

         $mem = new Memcache;

         $mem->connect("127.0.0.1", 11211)  or die("Could not connect");


         $version = $mem->getVersion();

         echo "Server's version: ".$version."<br/>\n";


         $mem->set('testkey', 'Hello World', 0, 600) or die("Failed to save data at the memcached server");

         echo "Store data in the cache (data will expire in 600 seconds)<br/>\n";


         $get_result = $mem->get('testkey');

         echo "$get_result is from memcached server.";         

?>

PS: 如果有输出“Hello World is from memcached.”等信息,则表明memcache已经能够正常工作。


安装php的memcache扩展:

PECL 简介

          PECL 的全称是 The PHP Extension Community Library ,是一个开放的并通过 PEAR(PHP Extension and Application Repository,PHP 扩展和应用仓库)打包格式来打包安装的 PHP 扩展库仓库。通过 PEAR 的 Package Manager 的安装管理方式,可以对 PECL 模块进行下载和安装。与以往的多数 PEAR 包不同的是,PECL 扩展包含的是可以编译进 PHP Core 的 C 语言代码,因此可以将 PECL 扩展库编译成为可动态加载的 .so 共享库,或者采用静态编译方式与 PHP 源代码编译为一体的方法进行扩展。PECL 扩展库包含了对于 XML 解析,数据库访问,邮件解析,嵌入式的 Perl 以及 Pthyon 脚本解释器等诸多的 PHP 扩展模块,因此从某种意义上来说,在运行效率上 PECL 要高于以往诸多的 PEAR 扩展库。

pecl常用选项:

  •      search      ###查找一下模块 

  •      info          ###查看模块信息 

  •      install       ###安装查找到的模块

1.使用pecl安装memcache模块:

            # /usr/local/php/bin/pecl  install  memcache

            # vim  /etc/php.d/memcache.ini      ###为php memcache 扩展提供配置文件

                           extension = "memcache.so"  

                           memcache.chunk_size = 32768

             # service  php-fpm restart

             # php -m | grep memcache             ###查看php已经安装的扩展模块

2.使用pear安装memcache模块:

             # wget http://pear.php.net/go-pear.phar     ###下载模块

             # /usr/local/php/bin/php  go-pear.phar       ###安装模块

             # /usr/local/php/bin/pear  install  memcache

             # service php-fpm  restart

PS:Pear,Pecl都是PHP扩展模块的集合。扩展PHP有两种方法:一种是用纯粹的PHP代码写函数和类。Pear就是这样一个项目。PEAR是PHP的官方开源类库(PHP Extension and Application Repository的缩写)。Pear在英文中是梨子的意思。PEAR将PHP程序开发过程中常用的功能编写成类库,涵盖了页面呈面、数据库访问、文件操作、数据结构、缓存操作、网络协议等许多方面,用户可以很方便地使用。它是一个PHP扩展及应用的一个代码仓库,简单地说,PEAR就是PHP的cpan。其主页是pear.php.net。另外一种是用c或者c++编写外部模块加载至php中。Pecl(The PHP Extension Community Library)就是干这个事的,PHP的标准扩展,可以补充实际开发中所需的功能。所有的扩展都需要安装,在Windows下面以DLL的形式出现;在 linux下面需要单独进行编译,它的表现形式为根据PHP官方的标准用C语言写成,尽管源码开放但是一般人无法随意更改源码。其主页是 pecl.php.net。最直接的表述:Pear是PHP的上层扩展,Pecl是PHP的底层扩展。这两种方法其实都是为特定的应用提供现成的函数或者类,本质上来说都是一样的。知道上面2个区别,对于我们安装就很方便理解了。我们一般用*.so文件扩展,需要运行:pecl。一般常用的还是使用pecl扩展。


第二种应用场景:

Nginx整合memcached:

            nginx的memcached_module模块可以直接从memcached服务器中读取内容后输出,后续的请求不再经过应用程序处理,如php-fpm、django,大大的提升动态页面的速度。nginx只负责从memcached服务器中读取数据,要往memcached写入数据还得需要后台的应用程序来完成,主动的将要缓存的页面缓存到memcached中,可以通过404重定向到后端去处理的。ngx_http_memcached_module可以操作任何兼用memcached协议的软件。如ttserver、membase等。

结构图如下:

memcached


Memcached的key可以通过memcached_key变量来设置,如以$uri。如果命中,那么直接输出内容,没有命中就意味着nginx需要从应用程序请求页面。同时,我们还希望该应用程序将键值对写入到memcached,以便下一个请求可以直接从memcached获取。如果键值不存在,nginx将报告not found错误。最好的方法是使用error_page指定和location请求处理。同时包含”Bad Gateway”错误和”Gateway Timeout”错误,如:error_page 404 502 504 = @app;。注意:需要设置default_type,否则可能会显示不正常。

Memcached模块支持的指令:

memcached_pass    
      语法:memcached_pass address:port or socket;    
      默认值:none    
      配置段:location, if in location    
Description:指定memcached服务器地址。使用变量$memcached_key为key查询值,如果没有相应的值则返回error_page 404。

memcached_read_timeout    
      语法:memcached_read_timeout time;    
      默认值:60s;    
      配置段:http, server, location    
Description:定义从memcached服务器读取响应超时时间。

memcached_send_timeout    
      语法:memcached_send_timeout    
      默认值:60s    
      配置段:http, server, location    
Description:设置发送请求到memcached服务器的超时时间。

memcached_next_upstream    
      语法:memcached_next_upstream error | timeout | invalid_response | not_found | off …;    
      默认值: error timeout;    
      配置段:http, server, location    
Description:指定在哪些状态下请求将转发到另外的负载均衡服务器上,仅当memcached_pass有两个或两个以上时使用。

memcached_connect_timeout    
      语法:memcached_connect_timeout time;    
      默认值:60s;    
      配置段:http, server, location    
Description:与memcached服务器建立连接的超时时间。通常不超过75s。
memcached_buffer_size    
      语法:memcached_buffer_size size;    
      默认值:4k|8k;    
      配置段:http, server, location    
Description:读取从memcached服务器接收到响应的缓冲大小。尽快的将响应同步传给客户端。     

配置实例:

server {
        listen       80;
        server_name  www.luochen.com;
       
        #charset koi8-r;
        #access_log  logs/host.access.log  main;

       location  /  {
               set $memcached_key $uri; ##定义从memcached服务器获取响应的键(将客户端的请求url作为键)
               memcached_pass     192.168.10.202:11211;     ##Memcached服务器
               default_type       text/html;
               error_page         404 @fallback;
        }

       location @fallback {
                proxy_pass    http://192.168.10.200;     ###web服务器
        }
}

PS:从上面的配置实例我们可以看出,一个请求到达后,会其url作为key去Memcached服务器192.168.10.202:11211上查找value,如果没有命中,则返回404。这时通过error_page将404接收转到@fallback,返回给Web服务器(192.168.10.200)去处理请求。获取数据后封装响应报文发给客户端并将客户端请求url作为键和web服务器响应后得到的数据一起存放到Memcached服务器中。


第三种应用场景:

将session存放到Memcached:

            首先需要配置php支持memcached,并且配置好Memcached服务器(这里不再赘述,仅仅是介绍如何将session共享)。

1.修改php的配置文件使其将session会话的信息放到Memcached中

编辑php.ini文件,确保如下两个参数的值分别如下所示:

        session.save_handler = memcache

        session.save_path = "tcp://172.16.100.15:11211?persistent=1&weight=1&timeout=1&retry_interval=15"

PS: persistent : 使用持久连接

         weight : 权重

         timeout : 超时时间

         retry_interval : 每隔15S重复一次

         172.16.100.15 :Memcached服务器地址

2.设置session

新建php页面setsession.php,为客户端设置启用session:

<?php

         session_start();

         if (!isset($_SESSION['www.luochen.com'])) {

                   $_SESSION['www.luochen.com'] = time();

         }

         print $_SESSION['www.luochen.com'];

         print "<br><br>";

         print "Session ID: " . session_id();

?>

3.获取session

新建php页面showsession.php,获取当前用户的会话ID:

<?php

         session_start();

         $memcache_obj = new Memcache();

         $memcache_obj->connect('172.16.100.15', 11211);

         $mysess=session_id();

         var_dump($memcache_obj->get($mysess));

         $memcache_obj->close();

?>

4.验证

在不同的后端服务器中获取session会话信息看是否一致