<?php
/**
CREATE TABLE IF NOT EXISTS `sessions` (
`session` varchar(255) character set utf8 collate utf8_bin NOT NULL,
`session_expires` int(10) unsigned NOT NULL default '0',
`session_data` text collate utf8_unicode_ci,
PRIMARY KEY (`session`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
*/
class Session {
/**
* a database connection resource
* @var resource
*/
private static $_sess_db; /**
* Open the session
* @return bool
*/
public static function open() {
if (self::$_sess_db = mysql_connect('localhost', 'root', '')) {
return mysql_select_db('my_application', self::$_sess_db);
}
return false;
} /**
* Close the session
* @return bool
*/
public static function close() {
return mysql_close(self::$_sess_db);
} /**
* Read the session
* @param int session id
* @return string string of the sessoin
*/
public static function read($id) {
$id = mysql_real_escape_string($id);
$sql = sprintf("SELECT `session_data` FROM `sessions` WHERE `session` = '%s'", $id);
if ($result = mysql_query($sql, self::$_sess_db)) {
if (mysql_num_rows($result)) {
$record = mysql_fetch_assoc($result);
return $record['session_data'];
}
}
return '';
} /**
* Write the session
* @param int session id
* @param string data of the session
*/
public static function write($id, $data) {
$sql = sprintf("REPLACE INTO `sessions` VALUES('%s', '%s', '%s')",
mysql_real_escape_string($id),
mysql_real_escape_string(time()),
mysql_real_escape_string($data)
);
return mysql_query($sql, self::$_sess_db);
} /**
* Destoroy the session
* @param int session id
* @return bool
*/
public static function destroy($id) {
$sql = sprintf("DELETE FROM `sessions` WHERE `session` = '%s'", $id);
return mysql_query($sql, self::$_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 static function gc($max) {
$sql = sprintf("DELETE FROM `sessions` WHERE `session_expires` < '%s'",
mysql_real_escape_string(time() - $max));
return mysql_query($sql, self::$_sess_db);
}
}//ini_set('session.gc_probability', 50);
ini_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')
);if (session_id() == "") session_start();
//session_regenerate_id(false); //also works fine
if (isset($_SESSION['counter'])) {
$_SESSION['counter']++;
} else {
$_SESSION['counter'] = 1;
}
echo '<br/>SessionID: '. session_id() .'<br/>Counter: '. $_SESSION['counter'];"open" /* session_start()调用 */
"close" /* 程序结束时调用 */
"read" /* session_start()调用 */
"write" /* 程序结束时调用 */
"destroy" /* session_destroy()调用 */
"gc" /* 操作系统gc进程调用 */上面是我从网上的例子中看到的(原文链接http://blog.csdn.net/zf213/archive/2009/06/22/4288567.aspx)
他例子中是
session_set_save_handler(array('Session', 'open'),
array('Session', 'close'),
array('Session', 'read'),
array('Session', 'write'),
array('Session', 'destroy'),
array('Session', 'gc')
);if (session_id() == "") session_start();
这样来调用,但他例子中的
function write($id, $data)
不是需要传递2个参数吗?而且这2个参数没设置默认值,所以肯定是要传递的吧??
谁能帮忙解释下一个session从初始化到被销毁时,session_set_save_handler是如何工作的?
/**
CREATE TABLE IF NOT EXISTS `sessions` (
`session` varchar(255) character set utf8 collate utf8_bin NOT NULL,
`session_expires` int(10) unsigned NOT NULL default '0',
`session_data` text collate utf8_unicode_ci,
PRIMARY KEY (`session`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
*/
class Session {
/**
* a database connection resource
* @var resource
*/
private static $_sess_db; /**
* Open the session
* @return bool
*/
public static function open() {
if (self::$_sess_db = mysql_connect('localhost', 'root', '')) {
return mysql_select_db('my_application', self::$_sess_db);
}
return false;
} /**
* Close the session
* @return bool
*/
public static function close() {
return mysql_close(self::$_sess_db);
} /**
* Read the session
* @param int session id
* @return string string of the sessoin
*/
public static function read($id) {
$id = mysql_real_escape_string($id);
$sql = sprintf("SELECT `session_data` FROM `sessions` WHERE `session` = '%s'", $id);
if ($result = mysql_query($sql, self::$_sess_db)) {
if (mysql_num_rows($result)) {
$record = mysql_fetch_assoc($result);
return $record['session_data'];
}
}
return '';
} /**
* Write the session
* @param int session id
* @param string data of the session
*/
public static function write($id, $data) {
$sql = sprintf("REPLACE INTO `sessions` VALUES('%s', '%s', '%s')",
mysql_real_escape_string($id),
mysql_real_escape_string(time()),
mysql_real_escape_string($data)
);
return mysql_query($sql, self::$_sess_db);
} /**
* Destoroy the session
* @param int session id
* @return bool
*/
public static function destroy($id) {
$sql = sprintf("DELETE FROM `sessions` WHERE `session` = '%s'", $id);
return mysql_query($sql, self::$_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 static function gc($max) {
$sql = sprintf("DELETE FROM `sessions` WHERE `session_expires` < '%s'",
mysql_real_escape_string(time() - $max));
return mysql_query($sql, self::$_sess_db);
}
}//ini_set('session.gc_probability', 50);
ini_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')
);if (session_id() == "") session_start();
//session_regenerate_id(false); //also works fine
if (isset($_SESSION['counter'])) {
$_SESSION['counter']++;
} else {
$_SESSION['counter'] = 1;
}
echo '<br/>SessionID: '. session_id() .'<br/>Counter: '. $_SESSION['counter'];"open" /* session_start()调用 */
"close" /* 程序结束时调用 */
"read" /* session_start()调用 */
"write" /* 程序结束时调用 */
"destroy" /* session_destroy()调用 */
"gc" /* 操作系统gc进程调用 */上面是我从网上的例子中看到的(原文链接http://blog.csdn.net/zf213/archive/2009/06/22/4288567.aspx)
他例子中是
session_set_save_handler(array('Session', 'open'),
array('Session', 'close'),
array('Session', 'read'),
array('Session', 'write'),
array('Session', 'destroy'),
array('Session', 'gc')
);if (session_id() == "") session_start();
这样来调用,但他例子中的
function write($id, $data)
不是需要传递2个参数吗?而且这2个参数没设置默认值,所以肯定是要传递的吧??
谁能帮忙解释下一个session从初始化到被销毁时,session_set_save_handler是如何工作的?
上面的
public static function gc($max) {
$sql = sprintf("DELETE FROM `sessions` WHERE `session_expires` < '%s'",
mysql_real_escape_string(time() - $max));
return mysql_query($sql, self::$_sess_db);
}
就是在设置超时的吧?
我把php.ini中的session.gc_maxlifetime设置为120,而且也重启服务器了
打开网页(网页中echo ini_get(session.gc_maxlifetime) 显示的也是120),然后什么也不做,大概3分钟后再去点击刷新,他还是刚才的那个session啊...
为什么会这样呢??
PHP原本的session处理中也有open、close、read、write等方法,然后用户可以通过session_set_save_handler函数来让php调用用户自定义的open、close等方法?但我想知道的是,像上面的write方法中,有2个形参,$id和$data,它们又是怎么被传递过来的?
都是php内部调用啊,你$_SESSION['x']=3; 的时候,
php就调用上面的write, id是session id, data就是3