首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何访问OpenSwoole WebSocket服务器中的会话数据?

如何访问OpenSwoole WebSocket服务器中的会话数据?
EN

Stack Overflow用户
提问于 2022-11-25 11:50:08
回答 1查看 7关注 0票数 0

我有一个用OpenSwoole实现的小型websocket服务器。是否有访问用户会话数据的方法?我试过这个:

代码语言:javascript
复制
<?php

use Swoole\WebSocket\Server;
use Swoole\Http\Request;
use Swoole\WebSocket\Frame;

$server = new Server("0.0.0.0", 9502);

$server->on("Start", function(Server $server)
{
    echo "Swoole WebSocket Server is started at http://127.0.0.1:9502\n";
});

$server->on('Open', function(Server $server, Swoole\Http\Request $request)
{
    echo "connection open: {$request->fd}\n";
    var_dump($request->cookie);
    echo "using session id ".$request->cookie['PHPSESSID']."\n";
    session_id(trim($request->cookie['PHPSESSID']));
    session_start();
    echo "user: ".$_SESSION['id_user'];
});
$server->on('Message', function(Server $server, Frame $frame)
{
    echo "received message: {$frame->data}\n";
   
    $server->push($frame->fd, json_encode(["hello", time()]));
});

$server->on('Close', function(Server $server, int $fd)
{
    echo "connection close: {$fd}\n";
});

$server->on('Disconnect', function(Server $server, int $fd)
{
    echo "connection disconnect: {$fd}\n";
});

当客户端连接到:

代码语言:javascript
复制
# php websocket.php 
Swoole WebSocket Server is started at http://127.0.0.1:9502
connection open: 1
array(1) {
  ["PHPSESSID"]=>
  string(26) "humr1mg4s26jp5fqkavih6tutf"
}
using session id humr1mg4s26jp5fqkavih6tutf
PHP Warning:  session_id(): Session ID cannot be changed after headers have already been sent in websocket.php on line 19
PHP Warning:  session_start(): Session cannot be started after headers have already been sent in websocket.php on line 20
PHP Warning:  Undefined variable $_SESSION in websocket.php on line 21
PHP Warning:  Trying to access array offset on value of type null in websocket.php on line 21
user:

是否有方法从websocket服务器启动用户PHP会话?用户会话本身是由托管在Apache上的网站PHP代码启动的。

EN

回答 1

Stack Overflow用户

发布于 2022-11-25 12:07:25

看起来,websocket服务器上的echo调用触发了“报头已经发送”错误。使用此方法可以:

代码语言:javascript
复制
$server->on('Open', function(Server $server, Swoole\Http\Request $request)
{
    session_id(trim($request->cookie['PHPSESSID']));
    session_start();
    // Do something ... and close the session afterwards.
    session_write_close();
});

其次,必须使用apache的系统用户启动websocket服务器,以访问会话数据:

代码语言:javascript
复制
# sudo -u www-data php websocket.php
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74572384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档