全局變量
在 swoole
協(xié)程當(dāng)中,我們都知道類似 $_GET
、$_SESSION
這樣的全局變量是不能安全使用的。原因是協(xié)程切換下會(huì)帶來數(shù)據(jù)污染問題。
驚喜
EasySwoole
在 spl
包中,實(shí)現(xiàn)了一個(gè) SplContextArray
,并在主進(jìn)程的位置,替換了這些全局變量,使得這些數(shù)據(jù)的訪問是安全的,并在請求結(jié)束后自動(dòng)清理。從而我們可以在使用一些 FPM
環(huán)境下的組件包時(shí)沒有影響。
注意:該特性下面的注冊和使用示例需要你的框架 easyswoole/http
組件版本大于等于 2.0.0。如果用戶easyswoole/http
組件版本在 1.6 ~ 1.7.19 之間請查看 全局變量舊版本用法
注冊
<?php
namespace EasySwoole\EasySwoole;
use EasySwoole\EasySwoole\AbstractInterface\Event;
use EasySwoole\EasySwoole\Swoole\EventRegister;
use EasySwoole\Http\GlobalParam\Hook;
use EasySwoole\Session\FileSession;
use EasySwoole\Session\Session;
class EasySwooleEvent implements Event
{
public static function initialize()
{
date_default_timezone_set('Asia/Shanghai');
// 配置 session,設(shè)置 session 數(shù)據(jù)文件存儲(chǔ)目錄為 EASYSWOOLE_TEMP_DIR
# $sesionHandler = new FileSession(EASYSWOOLE_TEMP_DIR . '/Session');
$globalParamHook = new Hook();
// 如果不需要使用 session 請勿注冊
// 使用時(shí)請先參考 session 章節(jié) http://www.fe88.cn/HttpServer/session.html,新增 \App\Tools\Session 類文件。
# \App\Tools\Session::getInstance($sesionHandler);
# $globalParamHook->enableSession(Session::getInstance());
$globalParamHook->register();
// onRequest v3.4.x+
\EasySwoole\Component\Di::getInstance()->set(\EasySwoole\EasySwoole\SysConst::HTTP_GLOBAL_ON_REQUEST, function (\EasySwoole\Http\Request $request, \EasySwoole\Http\Response $response) use ($globalParamHook) {
// 替換全局變量
$globalParamHook->onRequest($request, $response);
});
// afterRequest v3.4.x+
\EasySwoole\Component\Di::getInstance()->set(\EasySwoole\EasySwoole\SysConst::HTTP_GLOBAL_AFTER_REQUEST, function (\EasySwoole\Http\Request $request, \EasySwoole\Http\Response $response) {
});
}
public static function mainServerCreate(EventRegister $register)
{
}
}
事件注冊完畢后,即可使用
$_GET
、$_COOKIE
、$_POST
、$_FILES
、$_SERVER
、$_SESSION
。
使用
<?php
namespace App\HttpController;
use EasySwoole\Http\AbstractInterface\Controller;
class Index extends Controller
{
function index()
{
var_dump($_GET['a']);
var_dump($_SERVER);
}
}
注意
該特性需要 2.0.0
版本以上的 http
組件庫
"easyswoole/http": "^2.0.0"