EasySwoole Session 組件 2.x
由于在 Swoole
協(xié)程下,php
自帶的 session
函數(shù)是不能使用的。為此,EasySwoole
提供了獨立的 session
組件,實現(xiàn) php
的 session
功能。
組件要求
- php: >=7.1.0
- easyswoole/spl: ^1.3
- easyswoole/utility: ^1.1
- easyswoole/component: ^2.1
安裝方法
composer require easyswoole/session=2.x
倉庫地址
基本使用
注冊 session handler
使用 session
前,需要先注冊 session handler
。接下來的示例使用的 session handler
是 EasySwoole
內置的 session handler
,開箱即用。
注冊步驟:
修改 EasySwoole
全局的 event
文件(即框架根目錄的 EasySwooleEvent.php
文件),在 mainServerCreate
和 HTTP
的 全局 HTTP_GLOBAL_ON_REQUEST
事件中注冊 session handler
。
具體實現(xiàn)代碼如下:
<?php
namespace EasySwoole\EasySwoole;
use EasySwoole\Component\Di;
use EasySwoole\EasySwoole\AbstractInterface\Event;
use EasySwoole\EasySwoole\Swoole\EventRegister;
use EasySwoole\Http\Request;
use EasySwoole\Http\Response;
use EasySwoole\Session\Session;
use EasySwoole\Session\SessionFileHandler;
class EasySwooleEvent implements Event
{
public static function initialize()
{
date_default_timezone_set('Asia/Shanghai');
Di::getInstance()->set(\EasySwoole\EasySwoole\SysConst::HTTP_GLOBAL_ON_REQUEST, function (Request $request, Response $response): bool {
// TODO: 注冊 HTTP_GLOBAL_ON_REQUEST 回調,相當于原來的 onRequest 事件
// 獲取客戶端 Cookie 中 easy_session 參數(shù)
$cookie = $request->getCookieParams('easy_session');
if (empty($cookie)) {
$sid = Session::getInstance()->sessionId();
// 設置客戶端 Cookie 中 easy_session 參數(shù)
$response->setCookie('easy_session', $sid);
} else {
Session::getInstance()->sessionId($cookie);
}
return true;
});
Di::getInstance()->set(\EasySwoole\EasySwoole\SysConst::HTTP_GLOBAL_AFTER_REQUEST, function (Request $request, Response $response): void {
// TODO: 注冊 HTTP_GLOBAL_AFTER_REQUEST 回調,相當于原來的 afterRequest 事件
});
}
public static function mainServerCreate(EventRegister $register)
{
// 可以自己實現(xiàn)一個標準的 session handler,下面為組件內置實現(xiàn)的 session_handler
// 基于文件存儲,傳入 EASYSWOOLE_TEMP_DIR 目錄作為 session 數(shù)據(jù)文件存儲位置
$handler = new SessionFileHandler(EASYSWOOLE_TEMP_DIR);
// 設置 session 數(shù)據(jù)文件存儲前綴為 'easy_session',session 數(shù)據(jù)文件 savePath 為 EASYSWOOLE_TEMP_DIR
Session::getInstance($handler, 'easy_session', EASYSWOOLE_TEMP_DIR);
}
}
在 EasySwoole
中使用 session
注冊 session handler
之后,我們就可以在 EasySwoole 控制器
的任意位置使用了。
簡單使用示例代碼如下:
<?php
namespace App\HttpController;
use EasySwoole\Http\AbstractInterface\Controller;
use EasySwoole\Session\Session;
class Index extends Controller
{
public function index()
{
if (Session::getInstance()->get('a')) {
var_dump(Session::getInstance()->get('a'));
} else {
Session::getInstance()->set('a', time());
}
}
function des()
{
Session::getInstance()->destroy();
}
}
然后訪問 http://127.0.0.1:9501/index
(示例請求地址)就可以進行測試設置 session
,訪問 http://127.0.0.1:9501/des
(示例請求地址)就可以銷毀 session