【问题标题】:adding websockets to existing php application将 websockets 添加到现有的 php 应用程序
【发布时间】:2015-09-02 19:27:44
【问题描述】:

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

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

我对php、javascript有一定的经验,对http请求、node.js等有一定的了解,但我不是专家。

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

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

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

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

【问题讨论】:

  • 我认为 websockets 对于这样的任务来说太过分了。我会简单地使用轮询技术。让您的数据库引擎保存页面是否被锁定并在允许用户编辑之前检查锁定。
  • 锁定页面与传输机制无关。锁定数据库中的页面。为了在锁定更改时更新客户端 UI,可以通过 websocket 发出事件。然而,当用户想要开始编辑时,简单地尝试获得锁定可能会更容易(如果页面已经被锁定,这将导致失败)。
  • 但是您不会通过 websocket 事件更改数据库,而是通过另一个单独的调用对吗?这真的要容易得多 - 有时我认为方法很复杂:D
  • 如果我还想这样做,最好通过 ajax 请求简单地锁定页面并将事件发送给用户,对吗?
  • 这真的取决于你的设置。但是由于您已经在使用 php 和 ajax 进行操作,所以我会坚持这样做。

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


【解决方案1】:

我会采取的方法如下:

问题:(重申我的理解)

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

硬性要求

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

假设

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

方法

就个人而言,我会使用基于 PHP 的 WebSockets 服务器,但那是因为我偏向于自己编写的那个。因此,我将从 PHP-WebSockets 的角度来回答这个问题,对于任何可能无法翻译的特定于服务器的实现细节,我深表歉意。话虽如此,对您而言,使用您最熟悉的工具远比使用我推荐的工具重要得多,而且我尽量用笼统的术语来写。

客户端JS:

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

WebSockets 服务器:

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

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

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

  • 在查询任何锁时,响应该页面当前存在的所有锁。

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

【讨论】:

  • 嘿 Ghedipunk,非常感谢您的详细回答。这几乎就是我现在计划做的事情,在我考虑了一段时间后(至少总体而言:))+1 - 需要一些时间,但我会这样做,并会更新这篇文章之后。也许其他不太喜欢 websockets 的人可能需要它
猜你喜欢
  • 1970-01-01
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
  • 2017-03-01
  • 1970-01-01
  • 2016-06-25
  • 2014-11-26
  • 2012-01-27
相关资源
最近更新 更多