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 主类的功能,其他类一般不会对外单独调用,所以暂时放一起。 |