我創建了Ratchet Web Socket服務器並試圖使用SESSIONS。使用memcache進行棘輪會話數據同步
在對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);
,並連接到棘輪的WebSocket服務器的JavaScript
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
如果客戶端發送消息我獲取會話數據
$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在連接時讀取會話數據一次,然後會話對象是獨立的。
你能證實這種行爲嗎?或者我做錯了什麼。我認爲使用memcache的目標是能夠訪問來自不同連接客戶端的相同會話數據。
如果我在更改會話數據後重新連接到websocket,那麼數據已更新。