在监视页面上将 AJAX 调用替换为更好的解决方案


Replacing AJAX calls with a better solution on a monitoring page

问题

我开发了一个相当复杂的项目,它使用PHP和Laravel作为后端。站点的用户标记为可用或不可用以响应呼叫(如在调度中),并且呼叫存储在MySQL表中。目前,整个操作在共享的Web主机上运行,Laravel 4处理站点和传入数据(例如Twilio和 Iron.io 推送队列)。

客户希望在办公室的显示器上显示系统的状态 - 计算机和电视显示器专用于此。系统需要实时或尽可能接近,显示谁有空以及任何正在进行的呼叫。根本不会有用户与这方面的交互 - 它只是整天坐在那里显示数据。

现在,我只是使用 AJAX 在其网站上托管的页面上每六秒请求一次 JSON。他们的网络没有意识到这一点,我猜从长远来看,我们的共享托管环境可能不会喜欢它。我需要的是某种将数据直接发送到该计算机的方法,并且仅在某些内容发生变化并且没有任何用户交互客户端时才将其显示在页面上。这是我正在寻找的流程 -

  1. 用户更新其状态(即可用或不可用),
  2. Laravel 4后端接收请求(使用POST数据的三种可能方式之一),将其存储在数据库中,
  3. 客户端计算机接收此新信息并将其显示在 HTML 表中

我想到的解决方案

Node.js 安装在客户端计算机上,Socket.io 看起来很有希望接收推送数据。但是,我无法完全拼凑出如何仅在发生某些事情(用户的状态更改,调用被添加到系统)时才将数据从 PHP Laravel 4 服务器端发送到客户端。

我似乎只能在处理聊天室之类的东西的 websocket 上找到信息——这更像是"坐在那里几个小时直到发生某事"处理需要从 MySQL 中提取数据并将其推出。

我还想过在 Heroku 上设置一个 websocket 服务器,然后将数据从那里发送到客户端 - 但我再次陷入困境,仅在数据库发生更改时才完成发送数据(即,Laravel接收 POST 数据,然后用它做一些事情)。

任何想法将不胜感激。谢谢!

我认为websockets绝对是要走的路。Node在处理websockets方面相当不错,但没有理由重写你的应用程序,你可以将websockets与php一起使用。我会查看像这样的 PHP websockets 库进行集成。

websockets 的一般思路是,不是连接到服务器,让服务器传输数据,然后结束连接,使用 websockets,您可以保持连接活动,并且有一个 javascript 接口来接收从服务器发送的消息,即使在页面加载后也是如此。因此,在高层次上,您要做的是创建一个显示系统状态的页面,并将该页面的javascript连接到您将构建到应用程序中的websockets连接。然后在应用的体系结构中,当发生诸如用户更新其状态之类的事情时,您将通过 websocket 发送事件,并且页面将接收该事件并实时显示它。

远不是PHP专家,所以就具体的实现细节而言,我不能提供很多帮助,但希望这个和php websockets库的链接能让你走上正确的道路。似乎他们有非常好的文档,应该有助于指导您一路走来。我可以向您保证,为此使用套接字是要走的路,并且比轮询更好的解决方案。

编辑:这个库也可能对你感兴趣,虽然它看起来还不是超级稳定。

完成和完成! 事实证明,Pusher.com 正是我所需要的,在几分钟内我就过渡到它 - 问题完全解决了。幸运的是,这是一个活动非常低的项目,一个连接(我能想象到的最多是三个),每天只有几十次推送(如果那样的话)。远低于他们的免费沙盒限制。

老板会很高兴的。 ;)感谢您的回答,我今天学到了很多关于 websockets 的知识!