通过session_set_save_handler()来实现自定义session处理。
bool session_set_save_handler ( callback $open , callback $close , callback $read , callback $write , callback $destroy , callback $gc )
示例:
<?php function open($save_path, $session_name) { global $sess_save_path; $sess_save_path = $save_path; return(true); } function close() { return(true); } function read($id) { global $sess_save_path; $sess_file = "$sess_save_path/sess_$id"; return (string) @file_get_contents($sess_file); } function write($id, $sess_data) { global $sess_save_path; $sess_file = "$sess_save_path/sess_$id"; if ($fp = @fopen($sess_file, "w")) { $return = fwrite($fp, $sess_data); fclose($fp); return $return; } else { return(false); } } function destroy($id) { global $sess_save_path; $sess_file = "$sess_save_path/sess_$id"; return(@unlink($sess_file)); } function gc($maxlifetime) { global $sess_save_path; foreach (glob("$sess_save_path/sess_*") as $filename) { if (filemtime($filename) + $maxlifetime < time()) { @unlink($filename); } } return true; } /** 重新定义 */ session_set_save_handler("open", "close", "read", "write", "destroy", "gc"); session_start(); // proceed to use sessions normally
通过对象来处理,贴的代码来自67cms:
class fav_session { var $lifetime = 1800; function __construct() { session_set_save_handler(array(&$this,'open'), array(&$this,'close'), array(&$this,'read'), array(&$this,'write'), array(&$this,'destroy'), array(&$this,'gc')); session_start(); } function fav_session() { $this->__construct(); } function open($save_path, $session_name) { global $db,$CONFIG,$PHP_TIME; $this->lifetime = 1800; $this->time = $PHP_TIME; $this->pre = $CONFIG['tablepre']; $this->sess = &$db; return true; } function close() { $this->gc($this->lifetime); return $this->sess->close(); } function read($id) { $r = $this->sess->get_one("SELECT data FROM `{$this->pre}sessions` WHERE sessionid='$id'"); return $r ? $r['data'] : ''; } function write($id, $sess_data) { global $PHP_TIME; $this->sess->query("REPLACE INTO `{$this->pre}sessions` (sessionid, data, lastvisit) VALUES('$id', '".addslashes($sess_data)."', '".$PHP_TIME."')"); return true; } function destroy($id) { $this->sess->query("DELETE FROM `{$this->pre}sessions` WHERE sessionid='$id'"); return true; } function gc($maxlifetime) { $expiretime = $this->time-$maxlifetime; $this->sess->query("DELETE FROM `{$this->pre}sessions` WHERE lastvisit<$expiretime"); return true; } }