PHP SESSION不能在websocket服务器上工作


PHP SESSION not working in websocket server

我有一个简单的PHP websocket实时聊天应用程序。我使用apache服务器和websocket服务器。

当username成功登录时,我在login.php

中设置SESSION值为username,如下所示
@session_start();
$_SESSION["user"] = $username;

我必须启动websocket服务器php server.php.

因此,即使我启动会话,也无法获得$_SESSION["user"]的值。I给出一个错误未定义的索引用户

有人在PHP文档中疯狂地尝试这样做(我的答案是基于那个人)

但是基本上你要在当前web和命令行之间切换,你需要从web中获取当前会话id,并在cli中设置它。

Write_session.php

<?php
session_start();
$_SESSION['test']='test';
print_r($_SESSION);
echo session_id();
?>

write_session.php的输出

gqptpc3scf4k0h3vpl2d341u13

Read_session.php(我认为你需要找到一种安全的方式来发送会话id)

<?php
$ssid = "gqptpc3scf4k0h3vpl2d341u13";
session_id ($ssid);
session_start();
print_r($_SESSION);
?>

参考:http://php.net/manual/en/function.session-start.php#53293

这是可能的,然而,与Apache服务器启动一个会话,然后在websocket代码中访问会话cookie。

Apache服务器的文件启动会话。你可以发送会话id每次你发送一个新的消息到websocket服务器,你可以很容易地检查会话id。

看这个:

session_id("your session_id");    
session_start();
if(isset($_SESSION["SESSION_NAME"])){
     //keep connected and process request
}
else{
     //disconnect
}

会话ID在cookie中可用,通常命名为PHPSESSID(取决于session.name的php.ini设置),并且可以在session_name()执行期间检查和更改。

当用户连接时,WebSocket服务器可以使用HTTP报头,包括cookie。负责任的WS服务器应该存储这些标头,并通过用户对象(或连接对象,或任何存储并唯一标识将消息发送回连接的客户机的资源的对象)使它们对应用程序可用。

另外,请注意PHP会话系统在用户会话打开时锁定用户会话。因为WebSocket服务器被设计为连续运行,所以它们永远不会自己解锁会话。

所以,如果一个用户的会话是在WS中打开的,那么每个单独的AJAX和正常的web请求都会超时。该用户将无法使用您的网站。

同时,一个脚本一次只能打开一个会话。如果第二个用户连接到WS服务器,那么该用户将有权访问第一个用户的所有会话信息,而不能访问自己的会话。(有点像一个巨大的安全漏洞。)

因此,如果你打开一个会话,你必须尽快使用session_write_close()关闭会话。

关于WebSocket服务器中会话的具体实现,请参阅前面的问题和答案,作为在实现中寻找什么的示例。(注意:有些人可能会认为这个问题是重复的。虽然我希望这两个问题都保持活跃,但我认为,这里的这个问题应该是一个,因为它更通用(不涉及特定的WS服务器),并且上一个问题中给出的建议很快就会过时,因为该WS服务器正在积极开发。