【问题标题】:Using PHP session between apache and websocket server在 apache 和 websocket 服务器之间使用 PHP 会话
【发布时间】:2015-10-15 02:36:41
【问题描述】:

我正在使用来自https://github.com/Flynsarmy/PHPWebSocket-Chat 的 websocket 代码

我已经拥有 Mysql 的自定义用户帐户,用户在 login.php 连接到 websocket 登录。因此,我为特定用户设置了会话/cookie。举个例子

$_SESSION["user"] = 'xyz';//User is created.

问题是当我尝试使用 $_SESSION 时,即使是 session_id()。我未能获得 $_SESSION 值。我在 server.php 中执行此操作,这应该是使用 php server.php 命令运行的。我试试下面的代码。

session_id("lsjdfjl');
@session_start();
$user = $_SESSION["user"];

我收到错误消息说 取消定义索引 ...

是否有任何替代方法可以将上述 Websocket 服务器与自定义用户数据库相结合,并为不同的登录用户创建单独的聊天室。比如FB聊天/gmail聊天系统。

【问题讨论】:

    标签: php session websocket chat


    【解决方案1】:

    接受的答案并不准确。

    您可以使用相同的会话数据 - 请参阅此处:

    https://stackoverflow.com/a/49802049/1274820

    我也会在这里发布代码和图像以供后代使用,以避免链接失效:

    var cookie = require('cookie');
    var fs = require('fs');
    var phpUnserialize = require('php-unserialize');
    
    //This should point to your php session directory.
    //My php.ini says session.save_path = "${US_ROOTF}/tmp"
    var SESS_PATH = "C:/SomeDirectory/WhereYourPHPIs/tmp/";
    
    io.on('connection', function(socket) {
        //I just check if cookies are a string - may be better method
        if(typeof socket.handshake.headers.cookie === "string") {
            var sid = cookie.parse(socket.handshake.headers.cookie);
            if(typeof sid.PHPSESSID === "undefined") {
              console.log("Undefined PHPSESSID");
            }
            else {
                console.log("PHP Session ID: " + sid.PHPSESSID);
                fs.readFile(SESS_PATH + "sess_" + sid.PHPSESSID, 'utf-8', function(err,data) {
                    if(!err) {
                        console.log("Session Data:");
                        var sd = phpUnserialize.unserializeSession(data);
                        console.log(sd);
                    }
                    else {
                       console.log(err);
                    }
                });
            }
        }
    }
    

    结果:

    【讨论】:

      【解决方案2】:

      你不能使用同一个会话。

      您根本不能使用会话进行 websocket 连接。

      Websocket 连接是一个单独的连接,在不同的端口上,所以你的主会话在那里不可用。

      您需要阅读有关基于令牌的 websocket 身份验证。以下是从https://auth0.com/blog/2014/01/15/auth-with-socket-io/开始的一些信息

      【讨论】:

      • 我不能在 server.php 的函数 wsOnMessage 中使用 **GET ** 方法。你能告诉我使用GET的方法吗?哦,我是 websocket 的新手。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-05
      • 1970-01-01
      • 2014-01-17
      • 1970-01-01
      • 2019-04-08
      • 1970-01-01
      相关资源
      最近更新 更多