首页 > 数据库 > MySQL > 正文

解析php session_set_save_handler 函数的用法(mysql)

2020-03-22 19:06:04
字体:
来源:转载
供稿:网友
复制代码 代码如下:
?php
/*============================文件说明========================================
@filename: session.html' target='_blank'>class.php
@description: 数据库保存在线用户session,实现在线用户功能!
@notice: session过期时间一个小时,因为我们的站点是使用cookie(有效时间是1小时)登录。
因此我们只记录用户登录的时间,而不是刷新一次更新一次
删除数据库中session记录的动作发生在用户超时后执行这个文件或正常退出(session_destory)
@database: database:sessions field:sessionid(char32),uid(int10),last_visit(int10)
=============================================================================
*/
class session {
private $db;
private $lasttime=3600;//超时时间:一个小时
function session(&$db) {
$this- db =
session_module_name('user'); //session文件保存方式,这个是必须的!除非在Php.ini文件中设置了
session_set_save_handler(
array(&$this, 'open'), //在运行session_start()时执行
array(&$this, 'close'), //在脚本执行完成或调用session_write_close() 或 session_destroy()时被执行,即在所有session操作完后被执行
array(&$this, 'read'), //在运行session_start()时执行,因为在session_start时,会去read当前session数据
array(&$this, 'write'), //此方法在脚本结束和使用session_write_close()强制提交SESSION数据时执行
array(&$this, 'destroy'), //在运行session_destroy()时执行
array(&$this, 'gc') //执行概率由session.gc_probability 和 session.gc_divisor的值决定,时机是在open,read之后,session_start会相继执行open,read和gc
);
session_start(); //这也是必须的,打开session,必须在session_set_save_handler后面执行
}
function unserializes($data_value) {
$vars = preg_split(
'/([a-zA-Z_/x7f-/xff][a-zA-Z0-9_/x7f-/xff]*)/|/',
$data_value, -1, PREG_SPLIT_NO_EMPTY |
PREG_SPLIT_DELIM_CAPTURE
);
for ($i = 0; isset($vars[$i]); $i++) {
$result[$vars[$i++]] = unserialize($vars[$i]);
}
return $result;
}
function open($path, $name) {
return true;
}
function close() {
$this- gc($this- lasttime);
return true;
}
function read($SessionKey){
$sql = "SELECT uid FROM sessions WHERE session_id = '".$SessionKey."' limit 1";
$query =$this- db- query($sql);
if($row=$this- db- fetch_array($query)){
return $row['uid'];
}else{
return "";
}
}
function write($SessionKey,$VArray) {
require_once(MRoot.DIR_WS_CLASSES .'db_mysql_class.php');
$db1=new DbCom();
// make a connection to the database... now
$db1- connect(DB_SERVER, DB_SERVER_USERNAME, DB_SERVER_PASSWORD, DB_DATABASE);
$db1- query("set names utf8");
$this- db=$db1;
$SessionArray = addslashes($VArray);
$data=$this- unserializes($VArray);
$sql0 = "SELECT uid FROM sessions WHERE session_id = '".$SessionKey."' limit 1";
$query0 =$this- db- query($sql0);
if($this- db- num_rows($query0) =0){
if (isset($data['webid']) && !empty($data['webid'])) {
$this- db- query("insert into `sessions` set `session_id` = '$SessionKey',uid='".$data['webid']."',last_visit='".time()."'");
}
return true;
}else{
/*$sql = "update `sessions` set ";
if(isset($data['webid'])){
$sql .= "uid = '".$data['webid']."', " ;
}
$sql.="`last_visit` = null "
. "where `session_id` = '$SessionKey'";
$this- db- query($sql); */
return true;
}
}
function destroy($SessionKey) {
$this- db- query("delete from `sessions` where `session_id` = '$SessionKey'");
return true;
}
function gc($lifetime) {
$this- db- query("delete from `sessions` where unix_timestamp(now()) -`last_visit` '".$this- lasttime."'");
return true;
}
}
?

下面是php.ini中session的配置说明:
session.save_handler = "files"
存储和检索与会话关联的数据的处理器名字。默认为文件("files")。
如果想要使用自定义的处理器(如基于数据库的处理器),可用"user"。
有一个使用PostgreSQL的处理器:http://sourceforge.net/projects/phpform-ext/

session.save_path = "/tmp"
传递给存储处理器的参数。对于files处理器,此值是创建会话数据文件的路径。
Windows下默认为临时文件夹路径。
你可以使用"N[MODE]/path"这样模式定义该路径(N是一个整数)。
N表示使用N层深度的子目录,而不是将所有数据文件都保存在一个目录下。
[MODE]可选,必须使用8进制数,默认600(=384),表示每个目录下最多保存的会话文件数量。
这是一个提高大量会话性能的好主意。
注意0: "N[MODE]/path"两边的双引号不能省略。
注意1: [MODE]并不会改写进程的umask。
注意2: php不会自动创建这些文件夹结构。请使用ext/session目录下的mod_files.sh脚本创建。
注意3: 如果该文件夹可以被不安全的用户访问(比如默认的"/tmp"),那么将会带来安全漏洞。

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表