Session的问题

czf

chrome 打开页面 http://127.0.0.1:8082,使用到session

         $session = $request->session();
        //重新设置ticket
        $wechatTicket = $session->get('wechatTicket','');
        if (!$wechatTicket){
            $wechatTicket = Str::random(40);
            $session->set('wechatTicket',$wechatTicket);
        }
        return "hello";

在chrome 下能正确显示。

但是firfox、Safari 等浏览器打开同一个页面。报错!!!

Request->session() fail, header already send

定位于Workerman\Protocols\Http\Request 第305行 $this->connection === null 成立!

1068 2 0
2个回答

朕震惊了

用了swoole?估计是开了swoole协程导致的

  • czf 2022-05-12

    在php8.0下,删除cookie的sid就会复现!!

  • czf 2022-05-12

    同样的代码在php7.2,复现不出来,只有在php8.0才可以复现。

  • Tinywan 2022-05-12

    swoole 在8.0还不支持吧!

  • czf 2022-05-12

    不是用swoole,原生的select

  • Tinywan 2022-05-12

    有条件可以安装个event扩展试试

  • czf 2022-05-12

    是在 php8.0写入cookie可能有问题

walkor

是否使用了异步,定时器之类的操作?
执行 php -m 截图下。

Workerman\Protocols\Http\Request 第305行下面加一行代码打印下调用栈,发下调用栈。

if ($this->connection === null) {
    echo new \Exception('header already send'); // 这里加一行代码
    Worker::safeEcho('Request->session() fail, header already send');
    return false;
}
  • czf 2022-05-13

    已经解决了,并不是workerman的问题。骚操作导致。过度封装导致

年代过于久远,无法发表回答
🔝