PHP SESSION不工作在websocket服务器
我有一个简单的PHP websocket实时聊天应用程序。我使用Apache服务器以及websocket服务器。PHP SESSION不工作在websocket服务器
当用户名登录成功,我的login.php
@session_start();
$_SESSION["user"] = $username;
设置会话与价值的用户名下面我有PHP server.php启动的WebSocket服务器。
因此我无法获得$ _SESSION [“user”]的价值甚至我开始会话。 我给出的错误为未定义的索引用户。
有人PHP文档上是够疯狂尝试这种(我的回答是从人为主)
但基本上为您提供了对命令行您当前的网络之间进行切换,你需要抓住当前会话身份证从网络,并将其设置回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
我仍然无法在server.php中获得SESSION。我在login.php中设置了SESSION [“用户名”] COOKIE。它的空白数组。其他解决方案? – tashi
但是,可以启动与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检查一步一步的例子。
会话ID是可用在cookie中,通常命名为PHPSESSID
(依赖于session.name
php.ini的设置,并且可以在执行过程中与session_name()
进行检查和修改。
HTTP头,包括饼干,可用当用户连接到WebSocket服务器时,负责的WS服务器应该存储这些头并通过用户对象(或连接对象或任何对象存储并唯一标识要通过其发送的资源消息返回到连接的客户端)
另外,请注意,PHP会话系统在用户会话打开时会锁定它。由于WebSocket服务器设计为连续运行,因此它们永远不会自行解锁会话。
因此,如果用户的会话在WS中打开,那么每个AJAX和正常的Web请求都会超时。该用户根本无法使用您的网站。
此外,一次只能在脚本中打开一个会话。如果第二个用户连接到WS服务器,则该用户将有权访问第一个用户的所有会话信息,并且不访问他们自己的会话。 (有点大,巨大的安全漏洞。)
因此,如果您打开一个会话,您必须必须尽快使用session_write_close()
关闭会议。
请参阅this previous question并回答WebSocket服务器中会话的具体实现,作为在您的实现中寻找什么的示例。 (注意:有些人可能会试图将这个问题称为重复的问题,但我希望这两个问题都能保持活跃,我认为,这里的这个问题应该是支持的问题,因为它更一般化(不覆盖了一个特定的WS服务器),并且由于该WS服务器的积极开发,最后一个问题中给出的建议将很快过时。)
Web套接字需要更多的工作。所有这些看起来真的很诡异,也许一个来自Apache的专门的网络套接字服务器会做到这一点。 –
@Alex_Nabu:Apache的Web服务器将是错误的选择,因为HTTP流量和WebSocket流量是这样一种不同的范例。用与应用程序相同语言编写的WebSocket服务器确实是最好的选择,尤其是因为没有办法将类CGI接口放入WS连接(这是Web服务器如何处理向PHP发送Web请求的请求)。 - 瑕疵和黑客都完全放在PHP的肩膀上,但任何语言都会有自己的问题,除非像WS这样的东西被明确地设计到语言中。 – Ghedipunk
我只是在思考更多的标准化问题。使网络发展成为最大的开发者社区的一件事情是,有一种事实上的标准方式来完成一切。 Websockets有点改变。 TBH甚至没有任何理由使用PHP,现在考虑到你可以用任何你想要的语言来做一个套接字服务器。我得到的是应该有一些流行的实现,有点标准化我们在处理Web套接字时如何做事。一些流行的lib使得像php这样的东西变得很好很简单,而在apache/nginx ect –
您是否有session_start();在server.php? – Tobias
http://stackoverflow.com/questions/23230830/how-to-pass-session-variables-to-a-websocket-server –
是的,我开始session_start()开始会议; – tashi