全局变量

swoole 协程当中,我们都知道类似 $_GET$_SESSION 这样的全局变量是不能安全使用的。原因是协程切换下会带来数据污染问题。

惊喜

EasySwoolespl 包中,实现了一个 SplContextArray,并在主进程的位置,替换了这些全局变量,使得这些数据的访问是安全的,并在请求结束后自动清理。从而我们可以在使用一些 FPM 环境下的组件包时没有影响。

注意:该特性下面的注册和使用示例需要你的框架 easyswoole/http 组件版本大于等于 2.0.0。如果用户easyswoole/http 组件版本在 1.6 ~ 1.7.19 之间请查看 全局变量旧版本用法

注册

  1. <?php
  2. namespace EasySwoole\EasySwoole;
  3. use EasySwoole\EasySwoole\AbstractInterface\Event;
  4. use EasySwoole\EasySwoole\Swoole\EventRegister;
  5. use EasySwoole\Http\GlobalParam\Hook;
  6. use EasySwoole\Session\FileSession;
  7. use EasySwoole\Session\Session;
  8. class EasySwooleEvent implements Event
  9. {
  10. public static function initialize()
  11. {
  12. date_default_timezone_set('Asia/Shanghai');
  13. // 配置 session,设置 session 数据文件存储目录为 EASYSWOOLE_TEMP_DIR
  14. # $sesionHandler = new FileSession(EASYSWOOLE_TEMP_DIR . '/Session');
  15. $globalParamHook = new Hook();
  16. $globalParamHook->register();
  17. // 如果不需要使用 session 请勿注册
  18. // 使用时请先参考 session 章节 https://www.easyswoole.com/HttpServer/session.html,新增 \App\Tools\Session 类文件。
  19. # \App\Tools\Session::getInstance($sesionHandler);
  20. # $globalParamHook->enableSession(Session::getInstance());
  21. // onRequest v3.4.x+
  22. \EasySwoole\Component\Di::getInstance()->set(\EasySwoole\EasySwoole\SysConst::HTTP_GLOBAL_ON_REQUEST, function (\EasySwoole\Http\Request $request, \EasySwoole\Http\Response $response) use ($globalParamHook) {
  23. // 替换全局变量
  24. $globalParamHook->onRequest($request, $response);
  25. });
  26. // afterRequest v3.4.x+
  27. \EasySwoole\Component\Di::getInstance()->set(\EasySwoole\EasySwoole\SysConst::HTTP_GLOBAL_AFTER_REQUEST, function (\EasySwoole\Http\Request $request, \EasySwoole\Http\Response $response) {
  28. });
  29. }
  30. public static function mainServerCreate(EventRegister $register)
  31. {
  32. }
  33. }

事件注册完毕后,即可使用 $_GET$_COOKIE$_POST$_FILES$_SERVER$_SESSION

使用

  1. <?php
  2. namespace App\HttpController;
  3. use EasySwoole\Http\AbstractInterface\Controller;
  4. class Index extends Controller
  5. {
  6. function index()
  7. {
  8. var_dump($_GET['a']);
  9. var_dump($_SERVER);
  10. }
  11. }

注意

该特性需要 2.0.0 版本以上的 http 组件库

  1. "easyswoole/http": "^2.0.0"