向现有php应用程序添加websocket



我有一个php框架,它支持我构建网站,并允许我通过内联编辑直接在前端编辑内容。我有一个api,它通过ajax调用接收更新。

到目前为止,我是唯一一个使用它的人,但将来可能会有更多的人同时编辑页面,所以当有人开始编辑时,页面必须为其他用户锁定(可能还会显示当前正在查看页面的人(。

我在php、javascript方面有一些经验,对http请求、node.js等也有大致的了解,但我不是专家。

现在我想,我只需要设置一个websocket服务器,当用户查看和编辑单个页面时,告诉websocket server,为其他客户端更新页面,并通过javascript锁定编辑按钮。因此,页面在websocket服务器上只会被标记为锁定。

如果页面被锁定,也许我可以在更新页面内容时通过向websocket服务器发送另一个请求来检查页面的状态。还是应该直接通过websocketserver更新数据库,并将页面标记为锁定在数据库中?

你能告诉我我是走在正确的轨道上还是完全错误的方法吗?

附言:即使这可能是一种过度使用,我仍然想尝试它只是为了练习,因为我到目前为止还没有使用过这项技术:(

我将采用的方法如下:

问题:(重述以表明我的理解(

编辑内容时通知客户端以防止冲突。

硬性要求

使用WebSockets实现--用于教育目的。

假设

  • 发送编辑后的内容将继续通过AJAX调用完成
  • 客户端不需要知道当前未查看的页面上的内容
  • 客户端应该在页面加载后,在用户可以编辑内容之前(或至少一开始(了解内容的锁定状态
  • 这可能会成为一项要求,要求所有客户端都被告知页面上的内容已经更新,以便他们可以通过AJAX调用请求更新版本
  • 一个页面上可能会编辑多条内容,并且锁定应仅在每个内容块的基础上应用,而不是在每个页面的基础上。(例如,一个列出10个客户地址的页面,如果编辑1个地址,则让其他9个地址可供编辑。(

方法

就我个人而言,我会使用一个基于PHP的WebSockets服务器,但那是因为我对我写的那个有偏见。因此,我将从PHP WebSockets的角度来处理这个问题,对于任何可能无法翻译的特定于服务器的实现细节,我深表歉意。话虽如此,对你来说,使用你最熟悉的工具比使用我推荐的工具重要得多,我正在尽可能笼统地写作。

客户端JS:

  • 连接时,发送加载页面的URL
  • 在启动和完成(提交或中止(编辑时,发送一条消息,指示要锁定/解锁页面上的哪一位内容
  • 客户端可以在任何时间请求任何位内容的锁定状态

WebSockets服务器:

  • 在新连接上,存储他们所在的URL。(同一用户可以在多个浏览器选项卡中打开多个页面,但客户端的页面到套接字的关系应该始终是1对1。(如果页面的内容已锁定,请向该连接发送一条消息,说明哪个已锁定。

  • 在新的锁上,存储URL、客户端以及要锁定的内容。向注册到该URL的所有客户端(包括原始发件人,他将使用该回复作为确认(发送一条消息,说明现在锁定了哪些内容。如果需要,将锁定状态存储在数据库中。

  • 在移除锁定时,移除URL、客户端以及锁定的内容的记录,向注册到该URL的所有客户端发送消息,并从DB中清除标志。在这种方法中留出空间,以轮询数据库/框架内容是否已更改,从而可能告诉注册到该URL的客户端使其视图无效并获取新内容。

  • 在关于任何锁的查询中,使用该页面当前存在的所有锁进行响应。

  • 断开客户端连接时,移除所有锁。如果锁定已删除,请通知所有注册到该URL的客户端。如果用户重新连接,它将在一个单独的套接字上,因此他们无论如何都必须建立一个新的、不同的锁。也清理连接细节(无需尝试通过关闭的管道发送消息,对吧?(。

相关内容

  • 没有找到相关文章

最新更新