您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
workerman的http服务-session管理-更改存储驱动
发布时间:2021-12-09 23:44:43编辑:雪饮阅读()
- 实现 SessionHandlerInterface 接口
- 使用 Workerman\Protocols\Http\Session::handlerClass($class_name, $config) 方法替换底层SessionHandler接口
- read方法用来从存储中读取session_id对应的所有session数据。请不要对数据进行反序列化操作,框架会自动完成。
- write方法用来向存储写入session_id对应的session数据。请不要对数据进行序列化操作,框架已经自动完成。
- destroy方法用来销毁session_id对应的session数据。
- gc方法用来删除过期的session数据,存储应该对最后修改时间大于maxlifetime的所有session执行删除操作
- close 无需任何操作,直接返回true即可
- open 无需任何操作,直接返回true接口
- $class_name 为实现SessionHandlerInterface接口的SessionHandler类的名字。如果有命名空间则需要带上完整的命名空间
- $config 为SessionHandler类的构造函数的参数
除了文件session存储引擎和redis session存储引擎,workerman允许你通过标准的SessionHandlerInterface 接口添加新的session存储引擎,比如mangoDb session存储引擎、MySQL session存储引擎等。
添加新的session存储引擎流程
实现 SessionHandlerInterface 接口
自定义session存储驱动须实现 SessionHandlerInterface 接口。这个接口包含以下方法:
SessionHandlerInterface{
/* Methods */
abstractpublic read (string $session_id ):string
abstractpublic write (string $session_id ,string $session_data ):bool
abstractpublic destroy (string $session_id ):bool
abstractpublic gc (int $maxlifetime ):int
abstractpublic close (void):bool
abstractpublic open (string $save_path ,string $session_name ):bool
}
SessionHandlerInterface 说明
替换底层驱动
实现完SessionHandlerInterface接口后,使用以下方法更改session底层驱动。
Workerman\Protocols\Http\Session::handlerClass($class_name, $config);
具体实现
注意,这个MySessionHandler类仅仅为了说明更改session底层驱动的流程,MySessionHandler并不能用于生产环境。
实例:
<?php
use Workerman\Worker;
use Workerman\Protocols\Http\Session;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('http://0.0.0.0:8080');
class MySessionHandler implements SessionHandlerInterface
{
protected static $connect = null;
protected static $session_table = null;
public function __construct($config) {
self::$connect=mysqli_connect($config["host"],$config["user"],$config["password"],$config["database"],$config["port"]);
self::$session_table=$config["session_table"];
}
public function open($save_path, $name)
{
return true;
}
public function read($session_id)
{
$sql="select content from ".self::$session_table." where session_id='".$session_id."'";
$result=mysqli_query(self::$connect,$sql);
if($result){
$row=mysqli_fetch_assoc($result);
return $row["content"];
}
else{
return '';
}
}
public function write($session_id, $session_data)
{
$time=time();
$sql="insert into ".self::$session_table."(session_id,content,add_time) values('".$session_id."','".$session_data."',".$time.")";
$result=mysqli_query(self::$connect,$sql);
return $result;
}
public function close()
{
return true;
}
public function destroy($session_id)
{
$sql="delete from ".self::$session_table." where session_id='".$session_id."'";
$result=mysqli_query(self::$connect,$sql);
return $result;
}
public function gc($maxlifetime) {
$time_now = time();
$sql="delete from ".self::$session_table." where ${$time_now}-add_time>${$maxlifetime}";
$result=mysqli_query(self::$connect,$sql);
return $result;
}
}
// 假设新实现的SessionHandler类需要一些配置传入
$config['host'] ='192.168.43.71';
$config['user'] ='root';
$config['password'] ='xy220807';
$config['database'] ='sessionDb';
$config['port'] ='3306';
$config['session_table'] ='session_tab_1';
// 使用 Workerman\Protocols\Http\Session::handlerClass($class_name, $config) 来更改session底层驱动类
Session::handlerClass(MySessionHandler::class, $config);
$worker->onMessage = function(TcpConnection $connection, Request $request)
{
$session = $request->session();
$session->set('somekey', rand());
$connection->send($session->get('somekey'));
};
Worker::runAll();
?>
use Workerman\Worker;
use Workerman\Protocols\Http\Session;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('http://0.0.0.0:8080');
class MySessionHandler implements SessionHandlerInterface
{
protected static $connect = null;
protected static $session_table = null;
public function __construct($config) {
self::$connect=mysqli_connect($config["host"],$config["user"],$config["password"],$config["database"],$config["port"]);
self::$session_table=$config["session_table"];
}
public function open($save_path, $name)
{
return true;
}
public function read($session_id)
{
$sql="select content from ".self::$session_table." where session_id='".$session_id."'";
$result=mysqli_query(self::$connect,$sql);
if($result){
$row=mysqli_fetch_assoc($result);
return $row["content"];
}
else{
return '';
}
}
public function write($session_id, $session_data)
{
$time=time();
$sql="insert into ".self::$session_table."(session_id,content,add_time) values('".$session_id."','".$session_data."',".$time.")";
$result=mysqli_query(self::$connect,$sql);
return $result;
}
public function close()
{
return true;
}
public function destroy($session_id)
{
$sql="delete from ".self::$session_table." where session_id='".$session_id."'";
$result=mysqli_query(self::$connect,$sql);
return $result;
}
public function gc($maxlifetime) {
$time_now = time();
$sql="delete from ".self::$session_table." where ${$time_now}-add_time>${$maxlifetime}";
$result=mysqli_query(self::$connect,$sql);
return $result;
}
}
// 假设新实现的SessionHandler类需要一些配置传入
$config['host'] ='192.168.43.71';
$config['user'] ='root';
$config['password'] ='xy220807';
$config['database'] ='sessionDb';
$config['port'] ='3306';
$config['session_table'] ='session_tab_1';
// 使用 Workerman\Protocols\Http\Session::handlerClass($class_name, $config) 来更改session底层驱动类
Session::handlerClass(MySessionHandler::class, $config);
$worker->onMessage = function(TcpConnection $connection, Request $request)
{
$session = $request->session();
$session->set('somekey', rand());
$connection->send($session->get('somekey'));
};
Worker::runAll();
?>
实例运行:
[root@localhost workerman]# /usr/local/php734/bin/php -c /usr/local/php734/lib/php/php.ini start.php start
Workerman[start.php] start in DEBUG mode
----------------------------------------- WORKERMAN -----------------------------------------
Workerman version:4.0.22 PHP version:7.3.4
------------------------------------------ WORKERS ------------------------------------------
proto user worker listen processes status
tcp root none http://0.0.0.0:8080 1 [OK]
---------------------------------------------------------------------------------------------
Press Ctrl+C to stop. Start success.
http客户端访问:
[root@localhost mysqli]# elinks http://127.0.0.1:8080 --dump
1626022525
数据库中就有了session
关键字词:workerman,http,session,更改存储驱动
相关文章
- workerman的http服务-session管理-设置session存储位
- workerman的http服务-session管理-更改session存储引
- workerman的http服务-session会话-判断对应session数
- workerman的http服务-session会话-删除所有session数
- workerman的http服务-session会话-获取并删除session
- workerman的http服务-session会话-删除session数据
- workerman的http服务-session会话-存储session
- workerman的http服务-session会话-获取session中某个
- workerman的http服务-session会话-获取所有session数
- workerman的http服务-session会话-获取session对象