我创建了一个 Ratchet Web Socket 服务器并尝试使用 SESSIONS。
在 HTTP-Web 服务器(端口 80)上的 php 文件中,我像这样设置会话数据
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage;
use Symfony\Component\HttpFoundation\Session\Storage\Handler\MemcacheSessionHandler;
$memcache = new Memcache;
$memcache->connect('localhost', 11211);
$storage = new NativeSessionStorage(array(), new MemcacheSessionHandler($memcache));
$session = new Session($storage);
$session->start();
$session->set('uname', $uname);
并使用 Javascript 连接到 Ratchet Websocket 服务器
var RatchetClient = {
url: "ws://192.168.1.80:7070",
ws: null,
init: function() {
var root = this;
this.ws = new WebSocket(RatchetClient.url);
this.ws.onopen = function(e) {
console.log("Connection established!");
root.onOpen();
};
this.ws.onmessage = function(evt) {
console.log("Message Received : " + evt.data);
var obj = JSON.parse(evt.data);
root.onMessage(obj);
};
this.ws.onclose = function(CloseEvent) {
};
this.ws.onerror = function() {
};
},
onMessage : function(obj) {
},
onOpen : function() {
}
};
服务器脚本的工作方式如下所述:http://socketo.me/docs/sessions http://socketo.me/docs/sessions
如果客户端发送消息,我会获取会话数据
$memcache = new Memcache;
$memcache->connect('localhost', 11211);
$session = new SessionProvider(
new MyServer()
, new Handler\MemcacheSessionHandler($memcache)
);
$server = IoServer::factory(
new HttpServer(
new WsServer($session)
)
, 7070
);
$server->run();
class MyServer implements MessageComponentInterface {
public function onMessage(ConnectionInterface $conn, $msg) {
$name = $conn->Session->get("uname");
}
}
有用。如果我在连接到 websocket 之前设置会话数据,那么 uname 可以在我的套接字服务器脚本中获取。
每当我通过 ajax 或从另一个浏览器窗口更改会话数据时,我正在运行的客户端的会话数据将不会同步。
这意味着如果我更改 uname 或销毁会话,套接字服务器将无法识别这一点。情况似乎是,Ratchet 在连接时读取一次会话数据,之后会话对象就独立了。
你能证实这种行为吗?或者我做错了什么。我认为使用内存缓存的目标是能够从不同的连接客户端访问相同的会话数据。
如果我在更改会话数据后重新连接到 websocket,则数据已更新。