您的位置:首页 > 数据库 > Memcache

PHP如何将session保存到memcached中?如何分布式保存PHP session

2015-01-30 00:00 1001 查看

session_set_save_handler无关的memcached保存session的方法

在memcached服务器上
1)下载memcached
#wget http://memcached.googlecode.com/files/memcached-1.4.15.tar.gz 2)由于memcached依赖libevent所以需要先安装libevent库,这里直接yum安装
#yum install *libevent*
3)安装memcached
#./configure --prefix=/usr/local/memcached

#make

#make install
4)启动memcached
#/usr/local/memcached/bin/memcached -d -m 4096 -p 11211 -u root

-d daemon ?-p port -u ?user -m memory
在web server服务器上
5)在web server上安装php的memcache模块
#/usr/local/php/bin/pecl install memcache
Enable memcache session handler support? [yes] : yes(这里选择yes)
6)在php.ini中加入如下内容:
extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/memcache.so
7)修改php.ini中的session.save_handler及session.save_path为如下内容:
session.save_handler = memcache

session.save_path = "tcp://memcached服务器ip:11211"
亦可在PHP程序中
ini_set('session.save_handler', 'memcache');

ini_set('session.save_path', 'tcp://memcached服务器ip:11211');
注意:这种使用memcached保存session的方式与session_set_save_handler无关



安装完memcached之后
在php.ini中
将session.save_handler 修改为memcache,并修改save_path指向memcached的地址和端口即可

session.save_handler = memcache

session.save_path = tcp://127.0.0.1:11211

memcache的PECL这个扩展非常强大,可以支持failover以及分布存储。
使用方法很简单,只需要在session.save_path的参数列表中,使用逗号分隔各个memcached服务器,如:

session.save_path = "tcp://172.16.8.81:11211,tcp://172.16.8.82:11211,tcp://172.16.8.83:11211"

则保存的session会经过hash之后保存到各个memcached服务器中,而hash的算法memcache支持两种,crc32以及fnv:

memcache.hash_function= {crc32,fnv}

文档中很少有提到fnv算法的,据说其散列要比crc32更好,但是我通过以下小小的程序实验之后,发现仍旧是crc32的散列算法分布的更加平均。


<?php
ini_set("memcache.hash_function", "crc32");
$memcache = new Memcache;
$memcache1 = new Memcache;
$memcache2 = new Memcache;
$memcache->addServer('localhost', 11211);
$memcache->addServer('localhost', 11212);
$memcache->flush();
$memcache1->connect('localhost', 11211);
$memcache2->connect('localhost', 11212);
$fp1 = fopen("mem1.txt", "w");
$fp2 = fopen("mem2.txt", "w");
for ($i = 0; $i < 1000; $i++)
{
	$memcache->set($i, $i, 0, 1000);
	fwrite($fp1, $memcache1->get($i) . " ");
	fwrite($fp2, $memcache2->get($i) . " ");
}
fclose($fp1);
fclose($fp2);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Memcache