shuaiwei588 发表于 2015-8-31 11:05:45

session分别保存为文件,数据库和memcache中得做法

  本文章不设计跨域或跨子域或跨服务器保存,其他文章写了。
  
  保存在
  1、文件
没啥好说的,默认就是文件,保存目录在php.ini里配置,
  2、数据库(此处可配置域名,只是限制于二级域名)
  做法步骤:
  1)session的handler原来是 files,现在改为user,表示设置为用户级别的handler了。自定义了。但是session_set_save_handler这个函数的几个参数分别是
  bool session_set_save_handler ( callback $open , callback $close , callback $read , callback $write , callback $destroy , callback $gc )
  所以我们可以写函数,也可以写类,在php中,如果是调用类中得函数,需要用array(类名,函数名)这样的格式作为参数
  2)再设置一些php.ini中得参数,方便我们在函数中调用,比如session.name原来叫PHPSESSID有点长,我们可以改为sid
  ----------------------------示例------------------------------------
  $hostname = "localhost";    $dbname = "test";    $username = "root";    $pw = "";    $pdo = new PDO ("mysql:host=$hostname;dbname=$dbname","$username","$pw");   
$pdo->query("set names 'utf8'");
//让pdo同学来帮忙操作数据库:
$session=new session($pdo);
  //将 session.save_handler 设置为 user,而不是默认的 files
session_module_name('user');//本想用int_set("session.save_handler","user"),不知道为啥不成功
session_set_save_handler(array($session,'open'),
array($session,'close'),
array($session,'read'),
array($session,'write'),
array($session,'destroy'),
array($session,'gc'));
  //接下来:
//设置色session id的名字
ini_set('session.name', 'sid');
//不使用 GET/POST 变量方式
ini_set('session.use_trans_sid', 0);
//设置垃圾回收最大生存时间
ini_set('session.gc_maxlifetime', 3600);
//使用 COOKIE 保存 SESSION ID 的方式
ini_set('session.use_cookies', 1);
ini_set('session.cookie_path', '/');
//多主机共享保存 SESSION ID 的 COOKIE,注意此处域名为一级域名
ini_set('session.cookie_domain', 'localhost');

//以上都是SESSION的设置,不明白的多搜索下手册
//最后在你需要的地方将SESSION启动:
session_start();
$_SESSION["name"]="zhang3";
echo session_id();
  
<?php
    class session{
    private $db;
    function __construct($db){
      $this->db=$db;
    }
    public function open($save_path,$session_name){
          return true;
    }
    public function close(){
      $this->db=null;
    return true;
    }
    public function read($sid){
      $rs=$this->db->query("select * from sessions where sid='".$sid."'");
      foreach ($rs as $row){
            return $row['value'];
      }
    return null;
    }
    public function write($sid,$value){
      if(is_null($oldvalue=$this->read($sid))){
            //insert
            $str = "insert into sessions (sid,expiry,value)values('".$sid."',".time().",'".$value."')";
            return $this->db->query($str);
      }else{
            //update
            return $this->db->query("update sessions set expiry=’".time()."‘,value=’".$value."‘ where sid=’".$sid."‘");
      }
    }
    public function destroy($sid){
      return $this->db->query("delete from sessions where sid=’".$sid."‘");
    }
    public function gc($max_life_time){
      return $this->db->query("delete from sessions where expiry+’.$max_life_time.’<’.time().");
    }
}
  3、memcache中
  我们也可以按照上面的做法,写为user,然后增添相应的方法!!不过php中已经带了memcache,我们就没有必要啦
  <?php
//ini_set("session.save_handler","memcache");
session_module_name("memcache");
ini_set("session.save_path", "tcp://127.0.0.1:11211");
$mem = new Memcache;
$mem->connect("localhost", 11211); //这个端口是默认的,其实也可以通过360查看
$mem->set("key", "This is a test!", 0, 60);
$val = $mem->get("key");
session_start();
$_SESSION["name"] = "li4";
echo $mem->get(session_id());
?>
页: [1]
查看完整版本: session分别保存为文件,数据库和memcache中得做法