kphp框架中对自定义session会话处理采用的是写入数据库,而不是写入文件,为什么选择session写入数据库呢?企业建站选择的便宜的虚拟主机空间大多对文件读写操作限制很严格,而且安全性不是很高。
因此kphp框架考虑到企业建站的实际需求,便在kphp框架中对自定义session会话处理的方法是通过php的session_set_save_handler函数将session的会话数据保存到mysql数据库中,当然kphp框架中也有自定义session写入文件的操作类,因为分享给企业网站开发的用户所以这里分享session会话处理采用的是写入数据库。
php语言要自定义session会话其实很简单,主要是你会用php内置的session_set_save_handler函数进行回调操作,它是处理session会话进行自定义函数或类方法的函数,而且规定每一步操作函数或方法的名字,我们只需要根据自己操作的需求,在各自的函数或类方法中进行逻辑操作处理即可。
下面我们来分享一下kphp框架中实现自定义session会话处理方法,因为kphp框架对session会话处理采用的是写入数据库处理的机制,所以我们首先需要,建立一个保存session数据的表,我们起名sessions表的创建代码如下:
CREATE TABLE `sessions` (
`session_id` varchar(32) NOT NULL default '',
`session_data` text,
`session_last` datetime default NULL,
`session_name` varchar(50) default NULL,
PRIMARY KEY (`sessionid`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
表创建完之后,我们需要利用session_set_save_handler函数来实现自定义session的会话处理,kphp框架中的自定义session会员处理采用静态类的方式,这里对调用操作更加方便直观,详细代码如下:
include("Data.php");
class session
{
static function init()
{
session_set_save_handler(
array("session","open"),
array("session","close"),
array("session","read"),
array("session","write"),
array("session","destroy"),
array("session","gc")
);
}
static function open($save_path,$session_name)
{
return true;
}
static function close()
{
return true;
}
static function read($id)
{
$s_data = new Data();
$timenow = strftime("%Y-%m-%d %H:%M:%S", time());
$readsql = "select session_data from sessions where session_id='$id' and session_last > '$timenow'";
$rs = $s_data->sqlRow($readsql);
if(!empty($rs["session_data"]))
{
return $rs["session_data"];
}
else
{
return false;
}
}
static function write($id,$sess_data)
{
//echo "session writing now!<br>";
$s_data = new Data();
$unix_time = time()+MY_SESS_TIME;
$date_last = strftime("%Y-%m-%d %H:%M:%S", $unix_time);
$session_name = $_SERVER["REMOTE_ADDR"];
$wrow = $s_data->sqlRow("select session_id from sessions where session_id='$id'");
if(empty($wrow["session_id"]))
{
$n_session_id = session_id();
$sql = "insert into sessions set session_data='$sess_data', session_name='".$session_name."', session_last='$date_last', session_id='".$n_session_id."'";
}
else
{
$sql = "update sessions set session_data='$sess_data', session_name='".$session_name."', session_last='$date_last' where session_id='$id'";
}
$s_data->sqlExecute($sql);
}
static function destroy($id)
{
$s_data = new Data();
$sql = "delete from sessions where session_id = '$id'";
$bool = $s_data->sqlExecute($sql);
return $bool;
}
static function gc($maxlifetime)
{
$s_data = new Data();
$timenow = strftime("%Y-%m-%d %H:%M:%S", time());
$sql = "delete from sessions where session_last < '$timenow'";
return $s_data->sqlExecute($sql);
}
}
调用静态类方法
session::init();
session_start();
define("MY_SESS_TIME",2592000); //SESSION 生存时长
下面具体说一下6个回调静态方法的执行
session::open() 方法:在运行session_start()时执行
session::close() 方法:在所有session操作完后被执行
session::read() 方法:在session_start时,会去读取当前session数据
session::write() 方法:在脚本结束和使用session_write_close()强制提交SESSION数据时执行
session::destroy() 方法:删除指定的session会话ID
session::gc() 方法:执行概率由session.gc_probability 和 session.gc_divisor的值决定,时机是在open,read之后,session_start会相继执行open,read和gc.
kphp框架中自定义session的会话处理方法就这么简单,只需要你会调用即可,还有注意:session_start(); 一定要放到session::init(); 后面。
如果你后台需要调用session类则直接建立一个ini.php文件然后把下面内容写入即可:
include("../../kphp/session.php");
if(empty($_SESSION["admin_name"]))
{
echo "<script language=javascript>alert('登陆超时或者未登陆');location.replace('../login.php');</script>";
die();
}
后台只需要每个页面包含ini.php即可。
以上就是kphp框架实现自定义session会话处理方法的php代码是不是很简单。
原文来自于kphp开源框架,转载请注明出处:http://www.kphp.org/?dguide-show-11.html