<?php
// ini_set('session.save_handler', 'user');
// 注意 set_session_save_handler() 一定要在 session_start()前执行
// session.gc_probability =1 //session 回收机制的概率分子
// session.gc_divisor = 1000 // session 回收机制的概率分母
// session.gc_maxlifetime = 1440 // session 有效期
// 当开启 session 时,如 session_start(),
// 执行顺序为 sess_open() -> sess_read()->sess_write() -> sess_close() ->sess_destroy() -> sess_gc()
ini_set("session.save_handler", "user"); // 自定义保存方式
function sess_open($sess_path, $sess_name)
{
echo "session 路径:" . $sess_path . "<br />";
echo "session名称:" . $sess_name . "<br />";
return true;
}
function sess_close()
{
echo "session 关闭<br />";
return true;
}
function sess_read($sess_id)
{
echo "读取session id :" . $sess_id . "<br />";
return true;
}
function sess_write($sess_id, $data)
{
echo "写入数据 session id " . $sess_id . "<br />";
echo "session 数据 " . $data . "<br />";
return true;
}
function sess_destroy($sess_id)
{
echo "销毁 session id " . $sess_id . "<br />";
return true;
}
function sess_gc($sess_maxlifetime)
{
echo "session 回时机制,每隔时间为 " . $sess_maxlifetime;
return true;
}
session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc");
session_start();
$_SESSION['lin'] = 'lin3615';
echo 'hi, world ';
$_SESSION['long'] = 'good luck for you';
// 开启 cookie 时,默认时会以 session 名称 PHPSESSID 为了cookie 为记录
// 如 $_COOKIE['PHPSESSID'] = session_id; 值即为session_id值。
// 默认时,它们之间的关系是:session_name() = PHPSESSID ; $_COOKIE[session_name()] = session_id();
print_r($_COOKIE);
?>
================
以下适合
<?php
/*
数据表
CREATE TABLE IF NOT EXISTS `sessions` (
`id` char(200) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
`data` text COLLATE utf8_unicode_ci,
`timestamp` varchar(200) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
*/
class Session
{
/**
* a database connection resource
* @var resource
$maxTime 生存时间
*/
private $_sess_db;
private $maxTime;
/**
* Open the session
* @return bool
*/
public function open() {
$this->maxTime = get_cfg_var("session.gc_maxlifetime") > 0 ? get_cfg_var("session.gc_maxlifetime") : 3600;
if ($this->_sess_db = mysql_connect('localhost',
'root',
'123456')) {
return mysql_select_db('test', $this->_sess_db);
}
return false;
}
/**
* Close the session
* @return bool
*/
public function close() {
return mysql_close($this->_sess_db);
}
/**
* Read the session
* @param int session id
* @return string string of the sessoin
*/
public function read($id) {
$id = mysql_real_escape_string($id);
$sql = "SELECT `data` FROM `sessions` " .
"WHERE id = '" . $id . "'";
if ($result = mysql_query($sql, $this->_sess_db)) {
if (mysql_num_rows($result)) {
$record = mysql_fetch_assoc($result);
return $record['data'];
}
}
return '';
}
/**
* Write the session
* @param int session id
* @param string data of the session
*/
/*
replace [into] 与 insert 功能类似,不同点在于:replace into 首先尝试插入数据表中,如果发现表中已经有此行数据(根据主键或者唯一索引判定)则先删除此行,然后插入新的数据。否则直接插入数据。要注意是:插入数据的表必须有主键或者唯一索引。否则就成了 insert 了
*/
public function write($id, $data) {
$sql = sprintf("REPLACE INTO `sessions` VALUES('%s', '%s', '%s')",
mysql_real_escape_string($id),
mysql_real_escape_string($data),
mysql_real_escape_string(time() + $this->maxTime));
return mysql_query($sql, $this->_sess_db);
}
/**
* Destoroy the session
* @param int session id
* @return bool
*/
public function destroy($id) {
$sql = sprintf("DELETE FROM `sessions` WHERE `id` = '%s'", $id);
return mysql_query($sql, $this->_sess_db);
}
/**
* Garbage Collector
* @param int life time (sec.)
* @return bool
* @see session.gc_divisor 100
* @see session.gc_maxlifetime 1440
* @see session.gc_probability 1
* @usage execution rate 1/100
* (session.gc_probability/session.gc_divisor)
*/
public function gc($max) {
$sql = sprintf("DELETE FROM `sessions` WHERE `timestamp` < '%s'",
mysql_real_escape_string(time() - $max));
return mysql_query($sql, $this->_sess_db);
}
}
//ini_set('session.gc_probability', 50);
ini_set('session.save_handler', 'user');
$session = new Session();
session_set_save_handler(array($session, 'open'),
array($session, 'close'),
array($session, 'read'),
array($session, 'write'),
array($session, 'destroy'),
array($session, 'gc'));
// below sample main
session_start();
//session_regenerate_id(true);
if (isset($_SESSION['counter'])) {
$_SESSION['counter']++;
} else {
$_SESSION['counter'] = 1;
}
print_r($_SESSION);
//unset($_SESSION);
//session_destroy();
?>
<?php
// 以下这官网手册整合
/**
数据表
CREATE TABLE `ws_sessions` (
`session_id` char(100) NOT NULL default '',
`session_expires` int(11) unsigned NOT NULL default '0',
`session_data` text,
PRIMARY KEY (`session_id`)
) engine=InnoDB;
*/
class MySessionHandler implements SessionHandlerInterface
{
// 生存时间
public $lifeTime;
// 连接句柄
public $dbHandle;
function open($savePath, $sessName) {
// 获取生存时间
$this->lifeTime = get_cfg_var("session.gc_maxlifetime");
// $dbHandle = new mysqli("主机名", "用户名", "密码", "数据库名");
$dbHandle = new mysqli("localhost", "root", "", "test");
if($dbHandle->connect_error)
return false;
$this->dbHandle = $dbHandle;
return true;
}
function close() {
$this->gc(ini_get('session.gc_maxlifetime'));
// 关闭连接
return $this->dbHandle->close();
}
function read($sessID) {
// fetch session-data
$res = $this->dbHandle->query("SELECT session_data AS d FROM ws_sessions
WHERE session_id = '$sessID'
AND session_expires > ".time());
if($dd = $res->fetch_assoc())
{
return $dd['d'];
}
return "";
}
function write($sessID,$sessData) {
// 新的有效时间
$newExp = time() + $this->lifeTime;
$res = $this->dbHandle->query("SELECT * FROM ws_sessions
WHERE session_id = '$sessID'");
// 有效
if($res->num_rows) {
// 更新
$this->dbHandle->query("UPDATE ws_sessions
SET session_expires = '$newExp',
session_data = '$sessData'
WHERE session_id = '$sessID'");
// 更新是否生效
if($this->dbHandle->affected_rows)
return true;
}
else {
$this->dbHandle->query("INSERT INTO ws_sessions (
session_id,
session_expires,
session_data)
VALUES(
'" . $sessID ."',
" . $newExp .",
'" . $sessData ."')");
// 更新是否生效
if($this->dbHandle->affected_rows)
return true;
}
// 发生错误
return false;
}
function destroy($sessID) {
// delete session-data
$this->dbHandle->query("DELETE FROM ws_sessions WHERE session_id = '$sessID'");
// if session was deleted, return true,
if($this->dbHandle->affected_rows)
return true;
// ...else return false
return false;
}
function gc($sessMaxLifeTime) {
// delete old sessions
$this->dbHandle->query("DELETE FROM ws_sessions WHERE session_expires < ".time());
// return affected rows
return $this->dbHandle->affected_rows;
}
}
ini_set('session.save_handler', 'user');
$handler = new MySessionHandler();
session_set_save_handler($handler, true);
// 引用方法,以为另存文件,如:session.php,新建立文件,如test.php
include('session.php');
session_start();
$_SESSION['lin3615'] = date('Y-m-d H:i:s', time());
print_r($_SESSION);