Я создал Ratchet Web Socket Server и попытался использовать SESSIONS.
В моем php-файле на HTTP-Web-сервере (порт 80) я установил данные сеанса следующим образом
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);
и подключен к серверу Ratchet 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 после изменения данных сеанса, данные были обновлены.
Кажется, что Ratchet считывает данные сеанса один раз при подключении и после этого объект сеанса независим.
Да, так оно и работает.
https://groups.google.com/d/topic/ratchet-php/1wp1U5c12sU/discussion