本文章不设计跨域或跨子域或跨服务器保存,其他文章写了。
保存在
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());
?>