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 的其他功能。 哈哈
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.