
sesssion 是 swoole 的 http 应用最头疼的问题。 think-swoole 的 $_GET ,$_POST 之类方法也是不能直接用的, 否则一个 \co::sleep 就搞乱了。
我们继续用 SwooleHttpd 来 给其他应用 hack 以更方便使用
<>解决的示例代码: application/middleware.php<?php use DNMVCS\SwooleHttpd; use DNMVCS\SwooleContext; require_once('SwooleHttpd.php'); // 还是乱放 SwooleHttpd.php SwooleHttpd::G(); SwooleHttpd::ReplaceDefaultSingletonHandler(); if(isset($request) && isset($response) && $request instanceof \Swoole\Http\Request && $response instanceof \Swoole\Http\Response ){ SwooleHttpd::EnableCurrentCoSingleton(); SwooleHttpd::G()->initHttp($request,$response); } 上面的那段代码比较 hack. 原理是判断 是在 swoole 环境就初始化。
下面是 tp 的控制器代码,可以看到 session 在增加,到 10 个又回去。 application/index/controller
<?php namespace app\index\controller; use think\Controller; use DNMVCS\SwooleHttpd; class Index extends Controller { public function index() { SwooleHttpd::session_start(); echo "<h1> hello Session</h1><pre>\n"; echo "Current Session\n"; var_dump(SwooleHttpd::SG()->_SESSION); if(count(SwooleHttpd::SG()->_SESSION)>=10){ echo "Destroy Session!\n"; SwooleHttpd::session_destroy(); }else{ echo "Add a Session\n"; SwooleHttpd::SG()->_SESSION[DATE(DATE_ATOM)]=" "; } echo "</pre>"; return ''; } } 这个解决方案虽然够用,但不够完美。 $_SESSION => SwooleHttpd::SG()->_SESSION =>SG()->_SESSION 虽然用替换大法把老旧代码一行,和自定义 SG 函数可以省一点空间。 目前来说,已经是最接近的了
如果用自己的 session_handler 呢? SwooleHttpd::session_set_save_handler($your_session_handler);
SwooleHttpd::SG() 也有超全局变量 $_GET ,$_POST 等的 替换哦,虽然这里没演示。
SwooleHttpd 的更多功能,感兴趣的给个 star
https://github.com/dvaknheo/SwooleHttpd
上篇文章果真不足 10 个回复,所以继续介绍 SwooleHttpd 的其他功能。 哈哈
1 ywisax 2019-03-27 00:00:15 +08:00 = = 代码最好格式化一下吧。。 还有就是为啥代码都合并到一个文件了,上了 swoole 代码都常驻内存了,也节省不了 IO 时间,苦的是开发啊。。 |
2 to2false 2019-03-27 12:55:43 +08:00 代码全放一个文件,这... |
3 topthink 2019-03-28 18:33:04 +08:00 think-swoole 支持 session 干嘛非要用$_SESSION 呢? |
4 dvaknheo OP think-swoole 支持 session 干嘛非要用$_SESSION 呢? 1 为什么各个框架都要做自己的一套 session 类而不是直接用 PHP 的 $_SESSION 超全局变量呢。 除非官方建议说的 超全局变量不要用了。 2 这是随手用 thinkphp 来作为例子,其他框架很容易改,不用框架的也可以很快改过去。 3 我确实没注意到 think-swoole 有自己的 session 类。 |
5 dvaknheo OP 主要还是残留有一个文件带走的想法。虽然我放到 packagist 上了,可以 composer 方式引入。 还有 ,DNSingleton DNClassExt DNThrowQuickly 三个 底层 trait 是会和 DNMVCS 框架通用的。后两个可能不需要,DNSingleton 作为可变单例 G 函数的实现是必须的。 我不希望为了使用 SwooleHttpd 而引入相对庞大而不够稳定的 DNMVCS 框架。 另外文档已经介绍了 SwooleHttpd 主类的功能,其他类一般不会对外单独调用,所以暂时放一起。 |