V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dvaknheo
V2EX  ›  PHP

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

  •  
  •   dvaknheo · 2019-03-26 17:43:55 +08:00 · 3855 次点击
    这是一个创建于 2070 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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


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

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

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

    另外文档已经介绍了 SwooleHttpd 主类的功能,其他类一般不会对外单独调用,所以暂时放一起。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5657 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 09:09 · PVG 17:09 · LAX 01:09 · JFK 04:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.