将websockets添加到现有的php应用程序中

时间:2015-06-17 13:52:31

标签: php ajax node.js websocket socket.io

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

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

我在php,javascript以及对http请求,node.js等的粗略理解方面有一些经验,但我不是专家。

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

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

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

PS:即使它可能是一种矫枉过正,我仍然只想尝试练习,因为到目前为止我还没有使用过这种技术:)

1 个答案:

答案 0 :(得分:2)

我将采取的方法如下:

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

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

硬性要求

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

<强>假设

  • 将继续通过AJAX调用发送已编辑的内容。
  • 客户无需了解他们当前未查看的网页上的内容。
  • 客户应该在加载页面后,在用户可以使用编辑内容的能力之前(或至少尽快)了解内容的锁定状态。
  • 可能需要通知所有客户端页面上的内容已更新,以便他们可以通过AJAX调用请求更新版本。
  • 可能会在页面上编辑多条内容,并且锁定应仅适用于每个内容块,而不是每页。 (即,一个列出10个客户地址的页面,如果编辑1个地址,则让其他9个可供其他人编辑。)

<强>方法

就个人而言,我会使用基于PHP的WebSockets服务器,但那是因为我偏向于我写的那个。因此,我将从PHP-WebSockets的角度来看待这个答案,我为任何可能无法翻译的服务器特定实现细节道歉。话虽这么说,使用你最熟悉的工具比使用我推荐的工具更重要,我想尽可能用一般的术语写作。

客户端JS:

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

WebSockets服务器:

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

  • 在新锁上,存储URL,客户端以及正在锁定的内容。向所有已注册到该URL的客户端(包括发件人,将使用该回复作为确认)发送消息,说明现在锁定的内容。如果需要,将锁定状态存储在DB中。

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

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

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