PHP中的session有效期默认是1440秒(24分钟),也就是说,客户端超过24分钟没有刷新,当前session就会失效。很明显,这是不能满足需要的。 一个已知管用的方法是,使用session_set_save_handler,接管所有的session管理工作,一般是把session信息存储到数据库,这样可以通过SQL语句来删除所有过期的session,精确地控制session的有效期。这也是基于PHP的大型网站常用的方法。那么接下来将具体讲解如何使用session_set_save_handler;
session_set_save_handler---设置用户级 session 存储函数
函数原型 void session_set_save_handler (string open, string close, string read, string write, string destroy, string gc)
session_set_save_handler() 设置用户级 session 存储函数,用于存储和取回 session 相关的数据. 用于那些使用不同于 PHP Session 指定的存储方式的情况.
例如,在本地数据库存储 session 数据. 注意: 你必须设置 php.ini 里面的 session.save_handler配置参数来让 session_set_save_handler() 正常工作.默认配置是
session.save_handler = files, 如果想要使用自定义的处理器(如基于数据库的处理器),可用"user"。
函数原型 void session_set_save_handler (string open, string close, string read, string write, string destroy, string gc)
下面介绍该函数的每个参数的意义 ,每个参数都是一个回调函数,否则没意义:
string open 在运行session_start()时执行。
string close 在脚本执行完成或调用session_write_close() 或 session_destroy()时被执行,即在所有session操作完后被执行。
string read 在运行session_start()时执行,因为在session_start时,会去read当前session数据。
string write 此函数在脚本结束和使用session_write_close()强制提交SESSION数据时执行。
string destroy 在运行session_destroy()时执行即销毁一个会话中的全部数据时执行。
string gc 执行概率由session.gc_probability 和 session.gc_divisor的值决定,时机是在open,read之后,session_start会相继执行open,read和gc。
备注:session.gc_probability = 1
session.gc_divisor = 100
定义在每次初始化会话时,启动垃圾回收程序的概率。 这个收集概率计算公式如下:session.gc_probability/session.gc_divisor 对会话页面访问越频繁,概率就应当越小。建议值为1/1000~5000。
以下,则是具体的简单应用:
$session_mysql_conn = null;
$session_mysql_host = "127.0.0.1";
$session_mysql_user = "root";
$session_mysql_pwd = "root";
$session_mysql_db = "session";
$session_mysql_flag = false;
function open($save_path, $session_name)
{
global $session_mysql_host;
global $session_mysql_user;
global $session_mysql_pwd;
global $session_mysql_db;
if(null == $session_mysql_host
|| null == $session_mysql_user
|| null == $session_mysql_db)
return false;
global $session_mysql_conn;
$session_mysql_conn = mysql_connect($session_mysql_host, $session_mysql_user, $session_mysql_pwd);
if(false == $session_mysql_conn)
return (false);
if(false == mysql_select_db($session_mysql_db, $session_mysql_conn))
{
mysql_close($session_mysql_conn);
$session_mysql_conn = null;
return (false);
}
return(true);
}
function close()
{
return(true);
}
function read($id)
{
global $session_mysql_conn;
if(null == $session_mysql_conn)
return null;
$select_sql = "select value from session where id = '$id'";
$result = mysql_query($select_sql, $session_mysql_conn);
if(false == $result)
return null;
if(0 == mysql_num_rows($result))
return null;
$row = mysql_fetch_row($result);
if(empty($row))
return null;
$res = $row[0];
mysql_free_result($result);
//echo "session_mysql_read:$id = $res ";
return $res;
}
function write($id, $sess_data)
{
//echo "session_mysql_write $id = $sess_data ";
global $session_mysql_conn;
global $session_mysql_flag;
if(null == $session_mysql_conn)
return false;
$value = mysql_real_escape_string($sess_data);
$write_sql="update session set value = '$value' where id = '$id'";
if(false == $session_mysql_flag)
{
$select_sql = "select count(id) from session where id = '$id'";
$result = mysql_query($select_sql, $session_mysql_conn);
if(false == $result)
return false;
$row = mysql_fetch_row($result);
if(empty($row))
return false;
if($row[0] == 0)
{
$write_sql="insert into session (id,value) values ('$id', '$value')";
}
else
{
$session_mysql_flag = true;
}
}
return mysql_query($write_sql, $session_mysql_conn);
}
function destroy($id)
{
global $session_mysql_conn;
if(null == $session_mysql_conn)
return false;
mysql_close($session_mysql_conn);
$session_mysql_conn = null;
}
function gc($maxlifetime)
{
global $session_mysql_conn;
if(null == $session_mysql_conn)
return false;
$t = time() - $maxlifetime;
$d = date("Y-m-d h:i:s",$t);
$delete_sql = "delete from session where ctime < '$d'";
return mysql_query($delete_sql, $session_mysql_conn);
}
function set_session_mysql($s_mysql_host, $s_mysql_user, $s_mysql_pwd, $s_mysql_db)
{
global $session_mysql_host;
global $session_mysql_user;
global $session_mysql_pwd;
global $session_mysql_db;
$session_mysql_host = $s_mysql_host;
$session_mysql_user = $s_mysql_user;
$session_mysql_pwd = $s_mysql_pwd;
$session_mysql_db = $s_mysql_db;
session_module_name('user');
session_set_save_handler("open", "close", "read", "write", "destroy", "gc");
}
set_session_mysql("127.0.0.1","root","root","session");
session_start();
$_SESSION['A']="AAA";
$_SESSION['B']="AAA";
$_SESSION['C']="AAA";
?>
数据库中的表结构:
/*
* usage as:
*
* date_default_timezone_set("PRC");
* set_session_mysql("localhost:3306", "root", "", "db");
* session_start();
*
* #session table
*
CREATE TABLE `session` (
`id` varchar(100) NOT NULL DEFAULT '',
`value` mediumblob NOT NULL,
`ctime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURREN T_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
*/