利用memcache模拟session工作原理,从而替换session
memcache实际上就是个特殊的微型数据库,一个只有一个库一张表两个字段(名-值对)的数据库。它将数据缓存在内存中,其存取速度极快,是微量缓存的不二之选。
学习PHP不得不学习的是SESSION,运用最为广泛的是登录,其次是存取历史页面、购物车、页面跳转时携带数据等等作用。那这个SESSION是不是不可替换呢?我们先从它的工作原理开始谈:
1、在页面A中PHP调用session_start(),其作用其实是两个:
1>在服务器某处创建一个tmp缓存文件,用于存取session数据
2>将该缓存文件的名称SESSION_ID记录在客户端浏览器cookie中
2、在页面A中PHP设置$_SESSION['username']='Dean',实际上这是在tmp缓存文件中存入了一个名值对
3、在页面B中,PHP再次读到session_start(),于是从请求头文件中读取cookie记录的SESSION_ID,通过SESSION_ID在tmp文件夹中找到对应的tmp缓存文件,并打开。
4、在页面B中,PHP读到$_SESSION['username'],于是去缓存文件中读取对应的值。
以上就是SESSION的工作原理,SESSION仅仅只是负责保存数据,而cookie才是担负页面与页面之间传递的功臣。
废话不多说了,直接上代码:
function session($key, $value=''){
//判断memcache是否连接,若无则连接
static $mem = null;
static $mem_id = null;
if($mem === null || $mem_id === null){
$mem = new memcache;
$mem->connect('xxx.xxx.xxx.xxx', 11211) or die('Memcache连接失败');
if(isset($_COOKIE['session_id'])){
$mem_id = $_COOKIE['session_id'];
}else{
$mem_id = md5(time() . rand(1000,9999));
setcookie('session_id', $mem_id);
}
}
$name = $mem_id . '_' . $key;
//增加session
if($mem->get($name) === false && !empty($value)){
$mem->add($name, $value);
}
//删除session
elseif($mem->get($name) !== false && $value === null){
$mem->delete($name);
}
//修改session
elseif($mem->get($name) !== false && !empty($value)){
$mem->set($name, $value);
}
//获取session
elseif(empty($value)){
return $mem->get($name);
}
}
这个函数是PHP使用memcache来模拟session工作原理,从而取代session,用在高并发网站和分布式负载均衡网站上,会更加出色。当然这也仅限于你有配置一台memcache服务器,且IP地址是xxx.xxx.xxx.xxx,如果没有那先去配置吧,至于配置步骤网上到处都是,我就不多说了。另外如果你运行PHP的这台服务器上没有配置memcache,而是要用远程的memcache,那么就必须安装一个PHP扩展才能使用memcache。
http://http://www.zjjv.com///s/1i35iRXF
将扩展直接复制粘贴到ext目录下,然后配置php.ini,在众扩展配置之后手动加一句:
......
;extension=php_xsl.dll
;extension=php_zip.dll
extension=php_memcache.dll
好了,当你万事俱备后,上面那个取代SESSION的函数就可以成功执行了。
看到这里可能已经有大神在想如果客户端要是禁用cookie怎么办呢?对于PHP来说,客户端禁用了cookie,PHP还可以动态的将html中每个<a href="xxx.php">修改为<a href="xxx.php?SESSION_ID=xxxxxxxxxxxxxxxxxxxx">,也就是使用url来传递SESSION_ID。不过如果客户要是真禁用了cookie,那我估计国内大部分网站他都登录不上了,这种万中无一的客户,我的想法是直接放弃。况且我有强迫症,也不喜欢在好好的url上加个后缀,这样无疑会破坏很多美好的设计,如Ajax等。