我有一个简单的PHP websocket用于实时聊天应用程序。我使用apache服务器以及websocket服务器。
当用户名成功登录时,我在login.php
中设置了值为username的SESSION@session_start();
$_SESSION["user"] = $username;
我必须通过 php server.php 启动websocket服务器。
因此即使我开始会话,我也无法获得 $ _ SESSION [“user”] 的价值。 我将未定义索引用户。
作为错误答案 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服务器的主动开发,上一个问题中给出的建议很快就会过时。)