将 websockets 添加到现有 php 应用程序
adding websockets to existing php application
我有一个 php 框架,它支持我构建网站并允许我通过内联编辑直接在前端编辑内容。我有一种 api,它通过 ajax 调用接收更新。
到目前为止我是唯一一个使用它的人,但将来我可以有更多的人同时编辑页面,所以当有人开始编辑时页面必须为其他用户锁定(可能显示哪个人们目前也在查看该页面)。
对php、javascript有一些经验,对http请求、node.js等也有一定了解,但不是专家
现在我想,我只需要设置一个 websocket 服务器,告诉 websocket 服务器,当用户正在查看和编辑单个页面并为其他客户端更新页面并锁定编辑按钮时javascript。因此页面只会在 websocket 服务器上被标记为锁定。
如果页面被锁定,也许我可以在更新页面内容时通过向 websocket 服务器发送另一个请求来检查页面状态。或者我应该直接通过 websocketserver 更新数据库并在数据库中将页面标记为锁定?
你能告诉我我的做法是正确的还是完全错误的?
PS:即使这可能有点矫枉过正,我还是想尝试一下,只是为了练习,因为我到目前为止还没有使用过这项技术:)
我会采取的方法如下:
问题:(重述以表明我的理解)
编辑内容时通知客户以防止冲突。
硬性要求:
使用 WebSockets 实现 -- 用于教育目的。
假设:
- 发送编辑后的内容将继续通过 AJAX 个调用完成。
- 客户不需要了解他们当前未查看的页面上的内容。
- 在页面加载后,在用户可以编辑内容之前(或至少尽快),客户应该了解内容的锁定状态。
- 可能需要通知所有客户页面上的内容已更新,以便他们可以通过 AJAX 调用请求更新版本。
- 可能会在一个页面上编辑多条内容,并且锁定应该只应用在每个内容块的基础上,而不是每个页面的基础上。 (即一个页面列出了 10 个客户地址,如果编辑 1 个地址,则让其他 9 个地址可供其他人编辑。)
方法:
就个人而言,我会使用基于 PHP 的 WebSockets 服务器,但那是因为我偏向于我编写的那个。因此,我将从 PHP-WebSockets 的角度来处理这个答案,对于可能无法翻译的任何特定于服务器的实现细节,我深表歉意。话虽这么说,对您来说,使用您最熟悉的工具远比使用我推荐的工具重要得多,我尽量写得尽可能笼统。
客户端 JS:
- 连接时,发送已加载页面的 URL。
- 在启动和完成(提交或中止)编辑时,发送一条消息指示该页面上的内容到 lock/unlock。
- 客户端可以随时请求任何位内容的锁定状态。
WebSockets 服务器:
在新连接上,存储他们所在的 URL。 (同一用户可以在多个浏览器选项卡中打开多个页面,但客户端的页面到套接字的关系应始终是一对一的。)如果页面包含已锁定的内容,请向该连接发送一条消息,说明哪个已锁定。
在新锁上,存储URL,client,以及被锁的内容。向所有注册到该 URL 的客户(包括发起者,他将使用该回复作为确认)发送一条消息,告知现在锁定的内容。如果需要,将锁定状态存储在数据库中。
移除锁定时,移除 URL 客户端的记录,以及哪些内容被锁定,向所有注册到 URL 的客户端发送消息,并从数据库中清除标志。在此方法中留出空间以轮询 database/framework 内容是否已更改,可能会告诉注册到该 URL 的客户端使他们的视图无效并获取新内容。
在查询任何锁时,使用该页面当前存在的所有锁进行响应。
在客户端断开连接时,移除所有锁。如果锁被移除,通知所有注册到 URL 的客户端。如果用户重新连接,它将在一个单独的套接字上,因此他们无论如何都必须建立一个新的、不同的锁。还要清理连接详细信息(不需要尝试通过关闭的管道发送消息,对吧?)。
我有一个 php 框架,它支持我构建网站并允许我通过内联编辑直接在前端编辑内容。我有一种 api,它通过 ajax 调用接收更新。
到目前为止我是唯一一个使用它的人,但将来我可以有更多的人同时编辑页面,所以当有人开始编辑时页面必须为其他用户锁定(可能显示哪个人们目前也在查看该页面)。
对php、javascript有一些经验,对http请求、node.js等也有一定了解,但不是专家
现在我想,我只需要设置一个 websocket 服务器,告诉 websocket 服务器,当用户正在查看和编辑单个页面并为其他客户端更新页面并锁定编辑按钮时javascript。因此页面只会在 websocket 服务器上被标记为锁定。
如果页面被锁定,也许我可以在更新页面内容时通过向 websocket 服务器发送另一个请求来检查页面状态。或者我应该直接通过 websocketserver 更新数据库并在数据库中将页面标记为锁定?
你能告诉我我的做法是正确的还是完全错误的?
PS:即使这可能有点矫枉过正,我还是想尝试一下,只是为了练习,因为我到目前为止还没有使用过这项技术:)
我会采取的方法如下:
问题:(重述以表明我的理解)
编辑内容时通知客户以防止冲突。
硬性要求:
使用 WebSockets 实现 -- 用于教育目的。
假设:
- 发送编辑后的内容将继续通过 AJAX 个调用完成。
- 客户不需要了解他们当前未查看的页面上的内容。
- 在页面加载后,在用户可以编辑内容之前(或至少尽快),客户应该了解内容的锁定状态。
- 可能需要通知所有客户页面上的内容已更新,以便他们可以通过 AJAX 调用请求更新版本。
- 可能会在一个页面上编辑多条内容,并且锁定应该只应用在每个内容块的基础上,而不是每个页面的基础上。 (即一个页面列出了 10 个客户地址,如果编辑 1 个地址,则让其他 9 个地址可供其他人编辑。)
方法:
就个人而言,我会使用基于 PHP 的 WebSockets 服务器,但那是因为我偏向于我编写的那个。因此,我将从 PHP-WebSockets 的角度来处理这个答案,对于可能无法翻译的任何特定于服务器的实现细节,我深表歉意。话虽这么说,对您来说,使用您最熟悉的工具远比使用我推荐的工具重要得多,我尽量写得尽可能笼统。
客户端 JS:
- 连接时,发送已加载页面的 URL。
- 在启动和完成(提交或中止)编辑时,发送一条消息指示该页面上的内容到 lock/unlock。
- 客户端可以随时请求任何位内容的锁定状态。
WebSockets 服务器:
在新连接上,存储他们所在的 URL。 (同一用户可以在多个浏览器选项卡中打开多个页面,但客户端的页面到套接字的关系应始终是一对一的。)如果页面包含已锁定的内容,请向该连接发送一条消息,说明哪个已锁定。
在新锁上,存储URL,client,以及被锁的内容。向所有注册到该 URL 的客户(包括发起者,他将使用该回复作为确认)发送一条消息,告知现在锁定的内容。如果需要,将锁定状态存储在数据库中。
移除锁定时,移除 URL 客户端的记录,以及哪些内容被锁定,向所有注册到 URL 的客户端发送消息,并从数据库中清除标志。在此方法中留出空间以轮询 database/framework 内容是否已更改,可能会告诉注册到该 URL 的客户端使他们的视图无效并获取新内容。
在查询任何锁时,使用该页面当前存在的所有锁进行响应。
在客户端断开连接时,移除所有锁。如果锁被移除,通知所有注册到 URL 的客户端。如果用户重新连接,它将在一个单独的套接字上,因此他们无论如何都必须建立一个新的、不同的锁。还要清理连接详细信息(不需要尝试通过关闭的管道发送消息,对吧?)。