ThinkPHP Swoole 不能用 $_SESSION,用 SwooleHttpd 解决之

2019-03-26 17:43:55 +08:00
 dvaknheo

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 的其他功能。 哈哈

3858 次点击
所在节点    PHP
5 条回复
ywisax
2019-03-27 00:00:15 +08:00
= = 代码最好格式化一下吧。。
还有就是为啥代码都合并到一个文件了,上了 swoole 代码都常驻内存了,也节省不了 IO 时间,苦的是开发啊。。
to2false
2019-03-27 12:55:43 +08:00
代码全放一个文件,这...
topthink
2019-03-28 18:33:04 +08:00
think-swoole 支持 session 干嘛非要用$_SESSION 呢?
dvaknheo
2019-03-29 17:49:33 +08:00
think-swoole 支持 session 干嘛非要用$_SESSION 呢?


1 为什么各个框架都要做自己的一套 session 类而不是直接用 PHP 的 $_SESSION 超全局变量呢。
除非官方建议说的 超全局变量不要用了。

2 这是随手用 thinkphp 来作为例子,其他框架很容易改,不用框架的也可以很快改过去。

3 我确实没注意到 think-swoole 有自己的 session 类。
dvaknheo
2019-03-29 18:03:31 +08:00
主要还是残留有一个文件带走的想法。虽然我放到 packagist 上了,可以 composer 方式引入。
还有 ,DNSingleton DNClassExt DNThrowQuickly 三个 底层 trait 是会和 DNMVCS 框架通用的。后两个可能不需要,DNSingleton 作为可变单例 G 函数的实现是必须的。
我不希望为了使用 SwooleHttpd 而引入相对庞大而不够稳定的 DNMVCS 框架。

另外文档已经介绍了 SwooleHttpd 主类的功能,其他类一般不会对外单独调用,所以暂时放一起。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/548818

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX