PHP分布式框架怎样使用Memcache同步SESSION教程
发布时间:2022-02-24 14:02:10 所属栏目: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 se
至于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. (编辑:海南站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |