使用memcached处理Session信息

2025-11-11 18:35:25

1、用数据库来同步Session会加大数据库的负担,因为数据库本来就是容易产生瓶颈的地方,但如果采用MemCache来处理Session是非常合适的,因为MemCache的缓存机制和Session非常相似。另外,MemCach可以做分布式,能够把Web服务器中的内存组合起来,成为一个”内存池”,不管是哪个服务器产生的Session,都可以放到这个 “内存池”中、其他的Web服务器都可以使用。以这种方式来同步Session,不会加大数据库的负担,冰洁安全性也要比使用Cookie高。把session放到内存里面,读取也要比其他处理方式快很多。

  自定义使用memcached处理session信息,和自定义数据库的处理方式相同,但要简单得多,因为MemCache的工作机制和Session技术很相似。同样采用面向对象类的设计方法,也需要借助session_set_save_handler()函数来自定义处理过程,在memsession.class.php中声明类MEMSession的代码:

2、<?php

        

     Class MEMSession{

                   Const NS=”session_”;

        Protected static $mem=null;

         Protected static $lifetime=null;

Public static function start(Memcache $mem){

      Self::$mem=$mem;

       Self::$lifetime=ini_get(“session.gc_maxlifetime”);

      

Session_set_save_handler(

   Array(__CLASS__,’open’),

Array(__CLASS__,’close’),

Array(__CLASS__,’read),

Array(__CLASS__,’write),

Array(__CLASS__,’destroy),

    Array(__CLASS__,’gc)

);

Session_start();

}

Private static function open($path,$name){

         Return true;

}

Public static Function close(){

 Return true;

}

Private static Function read($id){

$out = self::$mem->get(self::session_key($sid));

If($out ===false || $out ===null){

  Return ‘’;

}

Return $out;

}

Public staticFunction write($sid,$data){

$method = $data ?’set’:’replace’;

Return selft::$mem->$method(self::session_key($sid),$data,MEMCACHE_COMPRESSED,self::$lifetime);

}

Public static Function destroy($sid){

 Return self::$mem->delete(self::session_key($sid));

}

Function gc($maxlifetime){

      Return true;

}

Private static function session_key($sid){

 $session_key =””;

If(defined(‘PROJECT_NS’)){

  $session_key.=PROJECT_NS:

}

$session_key.=self::NS.$sid;

Return $session_key;

}

}

3、本例声明的MEMSession类也可以直接应用在你的项目中。在上例的MEMSession类中也是声明了一个静态方法static(),用来开启会话及使用session_set_save_handler()函数自定义回调Session声明周期每个环节。另外,本例的声明比较简单,只是将Session的处理环节转嫁到了MemCache服务器的存取上。使用的方法和DBSession的应用相同。一是在有开启会话的位置,就将本了加载并直接调用静态方法static(),传递一个创建好的Memcache类的对象即可。

4、<?php

 Require “memsession.class.php”;

$mem = new Memcache();

$mem ->addServer(“localhost”,11211);

//$mem->addServer(“www.baidu.com”,11211);

//$mem->addServer(“jingyan.baidu.com”,11211);

MEMSession::start($mem);

$_SESSION[‘username’]=’admin’;

Echo $_SESSION[‘username’];

除了使用本例自定义的方式将Session保存到memcached服务器中,还可以通过修改php.ini文件中的session.save_handler和session.save_path两个选项,直接将Session信息保存到memcached服务器中,首先,设置session.save_hander选项的值为”memcache”,用来确定使用MemCache处理会话,再通过session.save_path选项设置存储的各memcached服务器连结的分隔符号,如”tcp:/host1:11211,tcp://host2:11211”。每个服务器的连结也都可以包含被接收于该服务器的参数,比较类似于使用Memcache::addServer()来添加服务器,如”tcp://host1:11211?persistent=1&weight=1&timeout=1&amp;retry_interval=15”

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
相关推荐
  • 阅读量:146
  • 阅读量:53
  • 阅读量:44
  • 阅读量:172
  • 阅读量:186
  • 猜你喜欢