php - 使用 memcache 的 Ratchet session 数据同步

标签 php session session-variables ratchet

我创建了一个 Ratchet Web Socket Server 并尝试使用 SESSIONS。

在 HTTP-Web 服务器(端口 80)上的 php 文件中,我这样设置 session 数据

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

如果客户端发送消息我获取 session 数据

$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 之前设置了 session 数据,那么 uname 就可以在我的套接字服务器脚本中使用。

每当我通过 ajax 或从另一个浏览器窗口更改 session 数据时,我正在运行的客户端的 session 数据将不会同步。

这意味着如果我更改 uname 或破坏 session ,套接字服务器将无法识别。似乎是 Ratchet 在连接时读取 session 数据一次,之后 session 对象是独立的。

你能证实这种行为吗?或者我做错了什么。我认为使用内存缓存的目标是能够从不同的连接客户端访问相同的 session 数据。

如果我在更改 session 数据后重新连接到 websocket,则数据已更新。

最佳答案

It seems to be the case that Ratchet reads the session-data once on connect and after that the session object is independent.

是的,这就是它的工作方式。

https://groups.google.com/d/topic/ratchet-php/1wp1U5c12sU/discussion

关于php - 使用 memcache 的 Ratchet session 数据同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25821199/

相关文章:

php - 如何获取放在标题位置的 pagekey?

ruby-on-rails - 当 appcache 存在时使用 AJAX 和 Rails 设置 session 变量

java - 从一个 jsp 页面到另一个页面执行 href 时创建一个新 session , session 变量返回为 null

c# - 在方法中获取 session 变量

php - 将特殊字符从数据库转换为普通字符

javascript - 当第二行文本字段与第一行文本字段具有相同值时如何警告错误

php - Zend_Tool 移除 Controller / Action

java - 如何将 session 对象放入 HashMap 中

java - 无法在运行批量数据库操作的子线程中获得 hibernate session

vb.net - 跨 session 维护自动完成/建议列表的最佳方法