之乎者也2011

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

本文章不设计跨域或跨子域或跨服务器保存,其他文章写了。

保存在

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());

?>

posted on 2011-09-05 01:05  之乎者也2011  阅读(519)  评论(0编辑  收藏  举报