加入收藏 | 设为首页 | 会员中心 | 我要投稿 拼字网 - 核心网 (https://www.hexinwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP分布式框架怎样使用Memcache同步SESSION教程

发布时间:2022-02-24 14:02:18 所属栏目:PHP教程 来源:互联网
导读:至于Memcache的安装配置,我们就不讲了,PHP分布式中使用Memcache来同步存储SESSION的步骤如下: 1、直接修改php.ini配置文件 session.save_handler = memcache session.save_path = tcp://127.0.0.100:11211 2、利用目录下的 .htaccess 文件 php_value sess
  至于Memcache的安装配置,我们就不讲了,PHP分布式中使用Memcache来同步存储SESSION的步骤如下:
 
  1、直接修改php.ini配置文件
 
  session.save_handler = memcache
  session.save_path = "tcp://127.0.0.100:11211"
  2、利用目录下的 .htaccess 文件
 
  php_value session.save_handler "memcache"
  php_value session.save_path "tcp://127.0.0.1:11211"
  说明:这个只是针对Apache的,目前使用Nginx的比较多,也不推荐此方式。
 
  3、项目中修改配置
 
  ini_set("session.save_handler", "memcache");
  ini_set("session.save_path", "tcp://127.0.0.100:11211");
  上面只是一些简单的说明,其实说点题外话,一般来说,做分布式,那肯定是有服务器权限的,所以推荐第一种。
 
  memcache分布式实现、memcache分布式的数据同步、memcache保存session数据的实现
 
  Memcache的分布式介绍
 
  memcached虽然称为“分布式”缓存服务器,但服务器端并没有“分布式”功能。服务器端仅包括内存存储功能,其实现非常简单。至于memcached的分布式,则是完全由客户端程序库实现的。这种分布式是memcached的最大特点。
 
  Memcached的分布式是什么意思?
 
  这里多次使用了“分布式”这个词,但并未做详细解释。现在开始简单地介绍一下其原理,各个客户端的实现基本相同。
 
  下面假设memcached服务器有node1~node3三台,应用程序要保存键名为“tokyo”“kanagawa”“chiba”“saitama”“gunma”的数据。
 
  首先向memcached中添加“tokyo”。将“tokyo”传给客户端程序库后,客户端实现的算法就会根据“键”来决定保存数据的memcached服务器。服务器选定后,即命令它保存“tokyo”及其值。
 
  
  配置使用memcache存储session数据
 
  session.save_handler = memcache
 
  session.save_path ="tcp://127.0.0.1:11211"
 
  或者某个目录下的 .htaccess :
 
  php_value session.save_handler"memcache"
  php_value session.save_path  "tcp://127.0.0.1:11211"
  再或者在某个一个应用中:
 
  ini_set("session.save_handler","memcache");
  ini_set("session.save_path","tcp://127.0.0.1:11211");
  使用多个 memcached server 时用逗号","隔开,并且和Memcache::addServer() 文档中说明的一样,可以带额外的参数"persistent"、"weight"、"timeout"、"retry_interval"等等,类似这样的:"tcp://host1:port1?persistent=1&weight=2,tcp://host2:port2"。
 
  存session:
 
  <?php
  session_start();
  if (!isset($_SESSION['TEST'])) {
     $_SESSION['TEST'] = time();
  }
  $_SESSION['TEST3'] = time();
  print $_SESSION['TEST'];
  print "<br><br>";
  print $_SESSION['TEST3'];
  print "<br><br>";
  print session_id();
  ?>
  从memcache中取回session数据:
 
  <?php
  $memcache = memcache_connect('localhost',11211);
  var_dump($memcache->get('19216821213c65cedec65b0883238c278eeb573e077'));
  ?>
  会有看到:
 
  string(37)"TEST|i:1177556731;TEST3|i:1177556881;"
 
  这样的输出,证明 session 正常工作,用 memcache 来存储 session 在读写速度上会比 files 时快很多,而且在多个服务器需要共用 session 时会比较方便,将这些服务器都配置成使用同一组 memcached 服务器就可以,减少了额外的工作量。缺点是 session 数据都保存在 memory 中,持久化方面有所欠缺,但对 session 数据来说也不是很大的问题。
 
  另外,WS Memcached Session Handler for PHP 提供一种用session_set_save_handler 来利用 memcached 的方法。。
 
  Linux下的Memcache安装
 
  1. 如果通过下载源码进行安装,则需要下载最新版本http://memcached.googlecode.com/files/memcached-1.4.13.tar.gz。
 
  如果通过apt-get方式安装,则无需下载。
 
  2. 进行memcache的安装:
 
  1).下载源码,进行编译安装
 
  Memcache用到了libevent这个库用于Socket的处理,所以还需要安装libevent,libevent的最新版本是https://github.com/downloads/libevent/libevent/libevent-2.0.19-stable.tar.gz,如果你的系统已经安装了libevent,则不需要安装。
 
  # cd /tmp
  # wget http://www.danga.com/memcached/dist/memcached-1.2.0.tar.gz
  # wgethttp://www.monkey.org/~provos/libevent-1.2.tar.gz
  2.先安装libevent:
 
  # tar zxvf libevent-1.2.tar.gz
  # cd libevent-1.2
  # ./configure --prefix=/usr
  # make
  # make install
  测试libevent是否已经安装。
 
  # ls -al /usr/lib | grep libevent
  lrwxrwxrwx 1 root root 21 11?? 12 17:38libevent-1.2.so.1 -> libevent-1.2.so.1.0.3
  -rwxr-xr-x 1 root root 263546 11?? 12 17:38libevent-1.2.so.1.0.3
  -rw-r--r-- 1 root root 454156 11?? 12 17:38 libevent.a
  -rwxr-xr-x 1 root root 811 11?? 12 17:38 libevent.la
  lrwxrwxrwx 1 root root 21 11?? 12 17:38 libevent.so-> libevent-1.2.so.1.0.3
  安装memcache
 
  安装memcached,同时需要安装中指定libevent的安装位置:
 
  # cd /tmp
  # tar zxvf memcached-1.2.0.tar.gz
  # cd memcached-1.2.0
  # ./configure --with-libevent=/usr
  # make
  # make install
  如果中间出现报错,请仔细检查错误信息,按照错误信息来配置或者增加相应的库或者路径。
 
  安装完成后会把memcached放到 /usr/local/bin/memcached 。
 
  测试是否成功安装memcached:
 
  # ls -al /usr/local/bin/mem*
  
  -rwxr-xr-x 1 root root 137986 11?? 12 17:39/usr/local/bin/memcached
  -rwxr-xr-x 1 rootroot 140179 11?? 12 17:39 /usr/local/bin/memcached-debug
  2)通过apt-get进行安装:
 
  sudo apt-get install memcached,推荐通过该方式进行安装,比较简单,不容易出现错误。
 
  启动memcache服务器:
 
  memcached -d -m 50 -p 11211 -uroot
 
  memcached常用启动参数描述:
 
  -d:启动一个守护进程,
 
  -m:分配给Memcache使用的内存数量,单位是MB,默认是64MB,
 
  -u:运行Memcache的用户
 
  -l:监听的服务器IP地址
 
  -p:设置Memcache监听的端口,默认是11211注:-p(p为小写)
 
  -c:设置最大并发连接数,默认是1024
 
  -P:设置保存Memcache的pid文件注:-P(P为大写)
 
  -h 显示帮助
 
  安装Memcache的PHP扩展
 
  通过地址http://pecl.php.net/get/memcache-2.2.6.tgz下载memcache最新的稳定版本。
 
  安装php的memcache扩展有两种方式:
 
  在linux下安装memcache扩展
 
  可以使用php自带的pecl安装程序
 
  # pecl install memcache
 
  或apt-get安装php的memcache扩展
 
  sudo apt-get installphp5-memcache
 
  也可以从源码安装
 
  # tar zxf memcache-2.2.3.tgz
  # cd memcache-2.2.3
  # /usr/local/servers/php5/bin/phpize
  #./configure --enable-memcache=/usr/local/servers/memcached--with-php-config=/usr/local/servers/php5/bin/php-config--with-apxs2=/usr/sbin/apxs
  # make && make inst
  安装完后会有类似这样的提示:
 
  Installing shared extensions:/usr/local/servers/php5/lib/php/extensions/no-debug-non-zts-20060922/
  把这个记住,然后修改php.ini,把
 
  extension_dir ="./"
 
  修改为:
 
  extension_dir ="/usr/local/servers/php5/lib/php/extensions/"
 
  并添加一行:
 
  extension="no-debug-non-zts-20060922/memcache.so"
 
  在windows下安装memcache扩展
 
  下载时要弄清楚自己的php版本,下载相对应的memcache扩展的版本,我用的是php5.2.6,下载地址为http://museum.php.net/php5/pecl-5.2.6-Win32.zip,解压后找到它的php_memcache.dll文件,放在php目录下的extension目录下,并在php.ini 加入一行 ‘extension=php_memcache.dll’。phpinfo下,看是否安装成功。
 
  Php的memcache
 
  使用实例:
 
  <?php
  //连接
  $mem = new Memcache;
  $mem->connect("192.168.0.200", 12000);
  //保存数据
  $mem->set('key1', 'This is first value', 0, 60);
  $val = $mem->get('key1');
  echo "Get key1 value: " . $val ."<br/>";
  //替换数据
  $mem->replace('key1', 'This is replace value', 0,60);
  $val = $mem->get('key1');
  echo "Get key1 value: " . $val ."<br />";
  //保存数组
  $arr = array('aaa', 'bbb', 'ccc', 'ddd');
  $mem->set('key2', $arr, 0, 60);
  $val2 = $mem->get('key2');
  echo "Get key2 value: ";
  print_r($val2);
  echo "<br />";
  //删除数据
  $mem->delete('key1');
  $val = $mem->get('key1');
  echo "Get key1 value: " . $val ."<br />";
  //清除所有数据
  $mem->flush();
  $val2 = $mem->get('key2');
  echo "Get key2 value: ";
  print_r($val2);
  echo "<br />";
  //关闭连接
  $mem->close();
  ?>
  Memcached集群
 
  Magent软件介绍
 
  magent是一款开源的memcached代理服务器软件
 
  地址: http://code.google.com/p/memagent/
 
  安装magent到/usr/local/下
 
  cd /usr/local
  mkdir magent
  cd magent/
  wgethttp://memagent.googlecode.com/files/magent-0.5.tar.gz
  tar zxvf magent-0.5.tar.gz
  /sbin/ldconfig
  sed -i "s/LIBS = -levent/LIBS =-levent -lm/g" Makefile
  make
  magent命令参数:
 
  -hthis message
  -u uid
  -g gid
  -p port, default is 11211. (0 to disable tcpsupport)
  -s ip:port, set memcached server ip and port
  -b ip:port, set backup memcached server ip andport
  -l ip, local bind ip address, default is 0.0.0.0
  -n number, set max connections, default is 4096
  -D don't go to background
  -k use ketama key allocation algorithm
  -f file, unix socket path to listen on. defaultis off
  -i number, max keep alive connections for onememcached server, default is 20
  -v verbose
  启动magent服务
 
  magent -u root -n 4096 -l 127.0.0.1 -p12000           -s127.0.0.1:8086           -s 127.0.0.2:8086            -b 127.0.0.1:11213
  magent的hash算法
 
  magent采用的是:Consistent Hashing原理,Consistent Hashing如下所示:首先求出memcached服务器(节点)的哈希值,并将其配置到0~232的圆(continuum)上。 然后用同样的方法求出存储数据的键的哈希值,并映射到圆上。 然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。如果超过232仍然找不到服务器,就会保存到第一台memcached服务器上。
 
  从上面的状态中添加一台memcached服务器。余数分布式算法由于保存键的服务器会发生巨大变化而影响缓存的命中率,但Consistent Hashing中,只有在continuum上增加服务器的地点逆时针方向的第一台服务器上的键会受到影响。
 
  利用magent实现对memecache的分布式管理,搭建一套memcache集群服务
 
  1、前端php对magent的访问跟对memcache访问相同,不需要做任何更改,对于插入的key,magent会把值散列到各个memcache服务上,只操作magent,不用关心后端处理
 
  2、公司项目应用:南北各10台前端,南北各部署一套magent服务,主要是考虑电信网通的跨网访问.以北方为例,每个前端安装memcached服务(大内存机器可以启动多个服务),每个前端都安装magent服务,后端挂载全部机器的 memcached服务,启动参数:
 
  magent-p 12000 -s 127.0.0.1:8086 -s 127.0.0.2:8086 -s 127.0.0.3:8086.......-s127.0.0.10:8086
  所有前端配置都是相同的,任何一个前端只需访问本地端口的magent,这样的memcache集群对应用带来很大便利.
 
  比如项目的基本配置信息,早期策略只能在中控机生成配置文件,同步到各个前端,没有办法把配置信息放到缓存中,因为各个前端的memcache是不共享 的,一台机器缓存更新,其它机器是不更新的,用程序去控制更新,还是存在不稳定因素,而且随着服务增多,也不便于管理,部署了magent后,就可以解决 这个问题,任何一个前端更新数据=全局更新
 
  这种部署还可以解决的应用:session共享
 
  Magent使用举例
 
  启动两个memcached进程,端口分别为11211和11212:
 
  memcached -m 1 -u root -d -l 127.0.0.1 -p 11211
 
  memcached -m 1 -u root -d -l 127.0.0.1 -p 11212
 
  启动两个magent进程,端口分别为10000和11000:
 
  magent -u root -n 51200 -l 127.0.0.1 -p 10000 -s127.0.0.1:11211 -b 127.0.0.1:11212
 
  magent -u root -n 51200 -l 127.0.0.1 -p 11000 -s127.0.0.1:11212 -b 127.0.0.1:11211
 
  -s 为要写入的memcached, -b 为备份用的memcached。
 
  说明:测试环境用magent和memached的不同端口来实现,在生产环境中可以将magent和memached作为一组放到两台服务器上。
 
  也就是说通过magent能够写入两个memcached。
 
  magent使用
 
  1、安装libevent:
 
  wget http://monkey.org/~provos/libevent-1.4.13-stable.tar.gz
  tar -xzvf libevent-1.4.13-stable.tar.gz
  cd libevent-1.4.13-stable
  ./configure --prefix=/usr/local/libevent
  make
  make install
  2、安装Memcached:
 
  wget http://memcached.googlecode.com/files/memcached-1.4.4.tar.gz
  tar -xzvf memcached-1.4.4.tar.gz  
  cd memcached-1.4.4
  ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent
  make
  make install
  ln -s /usr/local/libevent/lib/libevent-1.4.so.2 /usr/lib/
  3、编译安装magent:
 
  mkdir magent
  cp magent-0.5.tar.gz magent
  cd magent
  tar -xzvf magent-0.5.tar.gz  
  /sbin/ldconfig
  sed -i "s#LIBS = -levent#LIBS = -levent -lm#g" Makefile
  vi magent.c 添加
      #include <limits.h>
  make
  一、使用实例:
 
  memcached -m 1 -u root -d -l 192.168.1.219 -p 11211
  memcached -m 1 -u root -d -l 192.168.1.219 -p 11212
  memcached -m 1 -u root -d -l 192.168.1.219 -p 11213
  
  magent -u root -n 51200 -l 192.168.1.219 -p 12000 -s 192.168.1.219:11211 -s 192.168.1.219:11212 -b 192.168.1.219:11213
  1、分别在11211、11212、11213端口启动3个Memcached进程,在12000端口开启magent代理程序;
 
  2、11211、11212端口为主Memcached,11213端口为备份Memcached;
 
  3、连接上12000的magent,set key1和set key2,根据哈希算法,key1被写入11212和11213端口的Memcached,key2被写入11212和11213端口的Memcached;
 
  4、当11211、11212端口的Memcached死掉,连接到12000端口的magent取数据,数据会从11213端口的Memcached取出。
 
  三、整个测试流程:
 
  # telnet 192.168.1.219 12000
  Trying 1192.168.1.219...
  Connected to 192.168.1。219.
  Escape character is '^]'.
  stats
  memcached agent v0.4
  matrix 1 -> 192.168.1.219:11211, pool size 0
  matrix 2 -> 192.168.1.219:11212, pool size 0
  END
  set key1 0 0 5
  reesun
  STORED
  set key2 0 0 6
  reesun1
  STORED
  quit
  Connection closed by foreign host.
  
  # telnet 192.168.1.219 11211
  Trying 192.168.1.219...
  Connected to 192.168.1.219.
  Escape character is '^]'.
  get key1
  END
  get key2
  VALUE key2 0 6
  reesun1
  END
    
  # telnet 192.168.1.219 11213
  Trying 192.168.1.219...
  Connected to 1192.168.1.219.
  Escape character is '^]'.
  get key1
  VALUE key1 0 5
  reesun
  END
  get key2
  VALUE key2 0 6
  reesun1
  END
  quit
  Connection closed by foreign host. 

(编辑:拼字网 - 核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!