0
篇帖子
在深入PHP的MVC框架中遇到了session入库的这个操作,在看的学习教程中的PHP版本是PHP5+的环境。在php5+的版本中有session_set_save_handler这个方法可以实现用户自定义修改session入库,只需要实现open, close, read, write, destroy, gc方法就可以了,然后按照教程把实现的方法手打了一遍之后,硬是出现Fatal error: session_start(): Failed to initialize storage module: user…的错误,搜索引擎了一遍代码之后,仍然无法解决。
随后灵机一闪,我也把编程的环境也换成了PHP5+的环境,然后把session入库的方法重新敲了一遍,果不其然方法就可以实现了。随后去搜索引擎,搜了一遍关于PHP7中的session_set_save_handler说明之后再把环境换回去了PHP7+的版本。根据教程把方法和实例敲了一遍,在demo上算是成功的入库了。
然后根据自己写的mvc框架,把session封装成了类,方法实现到了基础控制类;
drop DATABASE if EXISTS session;
create DATABASE session CHARSET utf8;
use session;
drop TABLE if EXISTS session;
create table session (
sess_id char(32) UNIQUE NOT NULL,
sess_info text,
sess_expire int not null default 0
)CHARSET utf8 ENGINE INNODB;
<?php
class MySessionHandler implements SessionHandlerInterface
{
private static $_link = null;
public function open($save_path, $name)
{
if(is_null(self::$_link)) {
self::$_link = mysqli_connect("127.0.0.1", 'root', 8888, 'session');
}
if(!self::$_link) {
return false;
}
return true;
}
public function read($session_id)
{
$sql = "SELECT * FROM session WHERE sess_id = '{$session_id}'";
$result = mysqli_query(self::$_link, $sql);
if($row = mysqli_fetch_assoc($result)) {
return $row['sess_info'];
}
return '';
}
public function write($session_id, $session_data)
{
$time = time();
$sql = "REPLACE INTO session (sess_id, sess_info, sess_expire) VALUES ('{$session_id}', '{$session_data}', $time)";
return mysqli_query(self::$_link, $sql);
}
public function destroy($session_id)
{
$sql = "DELETE FROM session WHERE sess_id='{$session_id}'";
return mysqli_query(self::$_link, $sql);
}
public function gc($maxlifetime)
{
$time = time() - ini_get('session.gc_maxlifetime');
$sql = "DELETE FROM session WHERE sess_expire < {$time}";
return mysqli_query(self::$_link, $sql);
}
public function close()
{
mysqli_close(self::$_link);
return true;
}
}
$sessionHandler = new MySessionHandler();
session_set_save_handler($sessionHandler, true);
session_start();
手札完!
本博客内所有原创和翻译的文章的版权归本人所有,允许第三方转载,但转载时请务必保留作者名,并注明出处链接,否则本人将保留追究其法律责任的权利。
「人生在世,留句话给我吧」