2014-09-13 64 views
4

我創建了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,那麼數據已更新。

回答