使用 memcache 进行 Ratchet 会话数据同步

2024-01-11

我创建了一个 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,则数据已更新。


情况似乎是 Ratchet 读取会话数据一次 连接之后会话对象就独立了。

是的,这就是它的工作原理。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 memcache 进行 Ratchet 会话数据同步 的相关文章

随机推荐

  • Android:如何将 imageView 设置为谷歌地图 API android 中的标记?

    到目前为止 我一直在使用可绘制对象来填充地图上的标记 现在我想知道如果我可以将自定义图像视图显示为地图中的标记 那会很酷 直到现在我都这样做 itemized new Itemazide drawable mContext 我想实现类似的目
  • 打开、拆分 iTerm2 窗口并在每个窗格中执行命令

    我正在尝试创建一个脚本来打开iTerm2窗口 将其垂直分成 3 个窗格 并在每个窗格中运行一些命令 到目前为止 这是我的尝试 tell application iTerm2 activate Create main window creat
  • 需要帮助调试旨在更新 Google 云端硬盘中数百个文件的 Google Apps 脚本代码

    我工作的公司刚刚更新了其品牌 影响了保存到共享 Google 云端硬盘的数百个 Excel 和 PowerPoint 文件 有一个团队正在努力更新文件 我的挑战是找到一种有效的方法来添加新文件并删除 Google 云端硬盘中的旧文件 我创建
  • 实现一个简单的 Dagger2 示例

    我是 Dagger2 的新手 我一直使用 Koin 我正在尝试实现一个简单的示例 但我真的不知道我缺少什么 这是我到目前为止所得到的 应用程序 gradle ext daggerVersion 2 23 2 implementation c
  • “插入”和“删除”表是否保证在 AFTER UPDATE 触发器中以相同的顺序返回其记录?

    如果我有一个 AFTER UPDATE 触发器 将会 SELECT FROM inserted and SELECT FROM deleted 按同样的顺序把他们的记录还给我吗 IE 假设我能够索引到他们的结果集 将 del 5 和 ins
  • 将 CSV 文件导入 C#

    我正在构建一个网站 要求之一是用户从电子邮件客户端导出联系人 然后将其导入到网站中 因为每个电子邮件客户端以稍微不同的格式导出他们的联系人 这让我摸不着头脑 必须找到处理它的最佳方法 因为我不知道字段是什么 也不知道分隔符是什么 我只想瞄准
  • 获取字体支持的字符 - 在 C# 中

    我有一个支持日语字符的第三方字体 我需要将其用于应用程序 每当该字体不支持某个字符时 就会绘制常见的矩形 默认字符 显然 并非所有日语字符都受支持 因为如果我尝试绘制翻译办公室给我们的翻译 就会发现有很多矩形 每当使用不支持的字符时 我都需
  • 如何将 JS 对象集合发送到 ASP.NET API 服务?

    我正在尝试将 JavaScript 对象集合发送到我的 API 服务 但服务器收到空对象列表
  • 如何同时部署两个 ClickOnce 版本?

    我希望能够为我的应用程序提供一个测试 ClickOnce 服务器 用户可以在其中并行运行生产版本和测试版本 这可能吗 我首先尝试使用以下内容AssemblyInfo cs并且还更改了 ClickOnce 部署中的名称 尽管所实现的所有这些都
  • 何时将 volatile 与寄存器/局部变量一起使用

    在 CUDA 中使用 volatile 限定符声明寄存器数组的含义是什么 当我尝试使用 volatile 关键字和寄存器数组时 它删除了溢出寄存器内存到本地内存的数量 即强制 CUDA 使用寄存器而不是本地内存 这是预期的行为吗 我在 CU
  • 访问 BeanFactoryPostProcessor 中的属性

    我正在尝试创建一些东西 它将根据可配置的属性自动创建bean 来自application yml等 因为我不能像通常那样访问属性组件BeanFactoryPostProcessor 我有点困惑如何访问它们 如何访问应用程序属性BeanFac
  • 如何在 .NET 交互式笔记本中绘制图像(C#、VS Code)

    我正在尝试使用 C 在 NET 交互式笔记本中绘制简单的图形 有点像 Dr Racket 的 C 版本 到目前为止我见过的最简单的事情是using System Drawing SFML NET Raylib cs 也可以工作 但它们会打开
  • Python 中的 NoSql 注入

    当试图提出这个问题时 我得到了this one https stackoverflow com questions 4167077 mongodb injection它使用的是Java 并且在答案中给出了一个Ruby示例 并且似乎只有在使用
  • Vaadin 通过单击按钮重定向到 URL

    我已经搜索了很长时间 但我确实无法弄清楚这一点 如何将用户重定向到新的外部链接 例如www google com 当他们点击 Vaadin 中的按钮时 到目前为止我唯一能做的就是将链接放入链接中 Link link new Link lin
  • 如何构建没有版本后缀的ffmpeg共享库

    有没有一种方法可以配置为Android构建没有版本号后缀的ffmpeg共享库 我能够使用不同的选项进行构建 但总是得到像 libavcodec so 57 这样的文件 我需要没有后缀的库 例如 libavcodec so 我认为选项 dis
  • 为什么 UDP 在其数据包中有两次“UDP 长度”字段?

    为什么 UDP 在其数据包中有两次 UDP 长度 字段 这不是多余的吗 如果需要进行某种错误检查 请提供示例 你的观察是正确的 长度字段是多余的 因为IP头和UDP头都有长度字段 我对这种冗余原因的唯一猜测是 它发生是因为 UDP 是在当时
  • 部分 .csproj 文件

    是否可以将 csproj 中的信息拆分到多个文件中 有点像项目版本partial class特征 您不能拥有多个主 csproj 但因为 csproj 的底层接线是使用 msbuild 完成的 所以您可以简单地拥有多个相互导入的部分 csp
  • SwiftUI 列表在任何视图更改时重置滚动

    我有一个非常简单的列表 其中有一些部分 在同一视图中 我还有一个按钮 当选择任何列表项时 该按钮将被启用 这是由状态变量控制的 当发生这种情况时 如果列表向下滚动 状态变量将发生变化 以启用按钮 并且所有视图将刷新 导致我的列表滚动到顶部
  • 使用 pandas 组合日期和时间列

    我有一个带有以下列的 pandas 数据框 data Date 01 06 2013 02 06 2013 02 06 2013 02 06 2013 02 06 2013 03 06 2013 03 06 2013 03 06 2013
  • 使用 memcache 进行 Ratchet 会话数据同步

    我创建了一个 Ratchet Web Socket 服务器并尝试使用 SESSIONS 在 HTTP Web 服务器 端口 80 上的 php 文件中 我像这样设置会话数据 use Symfony Component HttpFoundat