如何检查用户是否已连接并获取其会话id(由PHP启动的会话)

如何检查用户是否已连接并获取其会话id(由PHP启动的会话),php,node.js,Php,Node.js,**我已经看到了一些关于这个问题的帖子,或者是这个问题的风格,但是他们是很久以前被问到的,我想得到一个更新的答案,这可能也会帮助其他人 我一直在使用PHP开发一个简单的网站(用于学习),带有注册和登录系统。现在有一些页面只有登录用户才能访问。 在PHP中,我只需启动一个会话,在用户登录时为其提供唯一的会话id,如果该页面只供登录用户查看,我只需检查会话是否已设置,并获取会话内容,该内容将用于从数据库中获取用户详细信息(姓名、生日等) 现在我想添加实时聊天功能,使用socket.io和Node.j

**我已经看到了一些关于这个问题的帖子,或者是这个问题的风格,但是他们是很久以前被问到的,我想得到一个更新的答案,这可能也会帮助其他人

我一直在使用PHP开发一个简单的网站(用于学习),带有注册和登录系统。现在有一些页面只有登录用户才能访问。 在PHP中,我只需启动一个会话,在用户登录时为其提供唯一的会话id,如果该页面只供登录用户查看,我只需检查会话是否已设置,并获取会话内容,该内容将用于从数据库中获取用户详细信息(姓名、生日等)

现在我想添加实时聊天功能,使用socket.io和Node.js。 因此,我需要只允许登录用户访问,并获取他们的会话id,以便我可以从数据库中获取他们的名称以显示。 这是到目前为止的基本工作聊天,适用于登陆
localhost:3000
:(包含两个文件:
index.html
,和
index.js

编辑:

这是我在PHP中用于登录用户的内容:

session_start();
$_SESSION['username'] = $username;
并检查他们是否已登录:

if (!isset($_SESSION['username'])) { //do stuff
我想保存聊天内容(如Facebook或WhatsApp聊天),因此我需要nodeJS可以访问会话,以便将聊天内容插入数据库,并从数据库中获取以前的内容,不是吗?或者我只能通过PHP来实现

----结束编辑---

index.js:

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

app.get('/', function(req, res){
  res.sendFile(__dirname + '/index.html');
});

io.on('connection', function(socket){
  console.log('a user connected');
    socket.on('chat message', function(msg){
    io.emit('chat message', msg);
    });
  socket.on('disconnect', function(){
    console.log('user disconnected');   
  });
});

http.listen(3000, function(){
  console.log('listening on *:3000');
});
<!doctype html>
<html>
  <head>    
    <script src="socket.io/socket.io.js"></script>
    <script
        src="https://code.jquery.com/jquery-3.3.1.min.js"
        integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="
        crossorigin="anonymous"></script>
    <script>
    $(function () {
        var socket = io();
        $('form').submit(function(){
        socket.emit('chat message', $('#m').val());
        $('#m').val('');
        return false;
    });
    socket.on('chat message', function(msg){
        $('#messages').append($('<li>').text(msg));
    });
  });
</script>
    
    <title>Socket.IO chat</title>
    <style>
      * { margin: 0; padding: 0; box-sizing: border-box; }
      body { font: 13px Helvetica, Arial; }
      form { background: #000; padding: 3px; position: fixed; bottom: 0; width: 100%; }
      form input { border: 0; padding: 10px; width: 90%; margin-right: .5%; }
      form button { width: 9%; background: rgb(130, 224, 255); border: none; padding: 10px; }
      #messages { list-style-type: none; margin: 0; padding: 0; }
      #messages li { padding: 5px 10px; }
      #messages li:nth-child(odd) { background: #eee; }
    </style>
    
  </head>
  <body>

    <ul id="messages"></ul>
    <form action="">
      <input id="m" autocomplete="off" /><button>Send</button>
    </form>
  </body>
</html>
index.html:

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

app.get('/', function(req, res){
  res.sendFile(__dirname + '/index.html');
});

io.on('connection', function(socket){
  console.log('a user connected');
    socket.on('chat message', function(msg){
    io.emit('chat message', msg);
    });
  socket.on('disconnect', function(){
    console.log('user disconnected');   
  });
});

http.listen(3000, function(){
  console.log('listening on *:3000');
});
<!doctype html>
<html>
  <head>    
    <script src="socket.io/socket.io.js"></script>
    <script
        src="https://code.jquery.com/jquery-3.3.1.min.js"
        integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="
        crossorigin="anonymous"></script>
    <script>
    $(function () {
        var socket = io();
        $('form').submit(function(){
        socket.emit('chat message', $('#m').val());
        $('#m').val('');
        return false;
    });
    socket.on('chat message', function(msg){
        $('#messages').append($('<li>').text(msg));
    });
  });
</script>
    
    <title>Socket.IO chat</title>
    <style>
      * { margin: 0; padding: 0; box-sizing: border-box; }
      body { font: 13px Helvetica, Arial; }
      form { background: #000; padding: 3px; position: fixed; bottom: 0; width: 100%; }
      form input { border: 0; padding: 10px; width: 90%; margin-right: .5%; }
      form button { width: 9%; background: rgb(130, 224, 255); border: none; padding: 10px; }
      #messages { list-style-type: none; margin: 0; padding: 0; }
      #messages li { padding: 5px 10px; }
      #messages li:nth-child(odd) { background: #eee; }
    </style>
    
  </head>
  <body>

    <ul id="messages"></ul>
    <form action="">
      <input id="m" autocomplete="off" /><button>Send</button>
    </form>
  </body>
</html>

$(函数(){
var socket=io();
$('form')。提交(函数(){
emit('chat message',$('#m').val());
$('m').val('');
返回false;
});
socket.on('chat message',函数(msg){
$(“#消息”).append($(“
  • ”).text(msg)); }); }); Socket.IO聊天 *{边距:0;填充:0;框大小:边框框;} 正文{字体:13px Helvetica,Arial;} 表单{background:#000;填充:3px;位置:固定;底部:0;宽度:100%;} 表单输入{边框:0;填充:10px;宽度:90%;右边距:5%;} 窗体按钮{宽度:9%;背景:rgb(130224255);边框:无;填充:10px;} #消息{列表样式类型:无;边距:0;填充:0;} #消息li{padding:5px 10px;} #留言李:第n个孩子(奇数){背景:#eee;}
      发送
    • 我需要做什么


      谢谢

      您可以将用户名与聊天信息一起发送。 例如,您的聊天信息包含“Hello world”,并且是用户“John Doe”发送的。 然后您可以发送这样的对象,而不仅仅是消息:

      { "name": "John Doe", "message": "Hello World" }
      
      到您的聊天应用程序

      在另一端,您解码这个JSON对象,并简单地显示名称和消息

      在您的情况下,这意味着更换以下部件:

      socket.emit('chat message', $('#m').val());
      

      $(“#消息”).append($(“
    • ”).text(msg));
    • $(“#消息”).append($(“
    • ”).text(msg.name+”:“+msg.message));
    • 什么是“登录用户”?为什么不检查该条件并包装调用以在该条件下初始化聊天?这意味着会话已从数据库中获取唯一的会话启动,当他们提供用户名和密码时:session_start()$_会话['username']=$username;但是我想保存聊天记录,所以我需要JS代码中的会话详细信息,以便将消息添加到MySQL数据库,不是吗?谢谢,顺便说一句,我编辑了这篇文章(在**编辑下)。编辑有关如何仅对登录用户启用聊天功能的信息。这是否意味着我可以简单地将PHP条件“if(!isset($\u SESSION['username'])”放在聊天文件(index.html)上方?这会起作用,尽管它并不完全安全。任何了解您的NodeJS服务器的人仍然可以从您的聊天室发送和接收消息。关于编辑:您可以在Javascript中保存消息,这样就不需要PHP了。LocalStorage似乎是实现这一点的正确API:我明白了,那么为了验证用户是否通过节点登录,您的方法是什么?所以即使有人知道服务器,也不能聊天,除非他是那个特定的用户?我需要将会话传递到index.js进行验证,对吗?或者还有一种更复杂的方法,在客户端(Javascript)端需要某种令牌,您可以将用户与之关联。与你所做的相比可能有点复杂。这也是你不能简单地在这样的编辑中解释的东西,这个帖子似乎解释了它:@pileup不一定,看看jwt
      $('#messages').append($('<li>').text(msg.name + ": " + msg.message));