PHP SESSION不在websocket服务器上工作

时间:2015-07-21 06:31:59

标签: php apache session websocket

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

当用户名成功登录时,我在login.php

中设置了值为username的SESSION
@session_start();
$_SESSION["user"] = $username;

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

因此即使我开始会话,我也无法获得 $ _ SESSION [“user”] 的价值。 我将未定义索引用户

作为错误

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

然而,可以启动与Apache服务器的会话,然后访问websocket代码中的会话cookie。

Apache服务器的文件启动会话。每次向websocket服务器发送新消息时都可以发送会话ID,并且可以轻松检查会话ID的会话。

看看这个:

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

OR

您可以从here检查分步示例。

答案 2 :(得分:0)

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

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

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

因此,如果在WS中打开用户的会话,则每个AJAX和普通Web请求都将超时。该用户根本无法使用您的网站。

此外,一次只能在脚本中打开一个会话。如果第二个用户连接到WS服务器,则该用户将可以访问第一个用户的所有会话信息,并且无权访问他们自己的会话。 (有点大,巨大,巨大的安全漏洞。)

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

请参阅this previous question并回答WebSocket服务器中会话的具体实现,作为实施中要查找的内容的示例。 (注意:有些人可能会试图将这个问题重复一遍。虽然我希望这两个问题都保持活跃,但我认为,这个问题应该是站在这里的问题,因为它更通用(不是覆盖一个特定的WS服务器),由于该WS服务器的主动开发,上一个问题中给出的建议很快就会过时。)