我有一个基于php的Web应用程序,它捕获数据库表中的某些事件。它还具有捕获事件的可视化:一个html表,列出由ajax控制的事件。
我想添加一个可选的“实时”功能:按下按钮(“开启”)后,从该时刻开始捕获的所有事件都将插入已经可见的表格中。必须做三件事:注意事件,获取事件数据并将其插入表中。为了使服务器负载保持在理智的范围内,我不想使用ajax请求轮询新事件,而是我更喜欢长轮询策略。
显然,当进行长轮询ajax调用时,对应的服务器必须监视一个事件。由于事件是通过php脚本注册的,因此没有简单的方法来注意该事件,而无需再次轮询数据库以进行更改。这是因为捕获操作在另一个进程中运行,而不是观察长轮询请求。我环顾四周寻找一种可用的机制来进行这种进程间通信,因为我从linux下的富客户端知道它。确实有信号量,共享内存甚至posix的php扩展。但是它们都只存在于linux(或unix like)系统中。虽然通常不会在极少数情况下在MS-Windows系统下使用该应用程序。
所以我的简单问题是:是否有任何方法通常可用于所有(大多数)系统,可以将此类事件推送到服务于长轮询ajax请求的php脚本?没有轮询文件或数据库的东西,因为我已经在其他地方发生了一个事件?
答案 0 :(得分:0)
所以,最初的警告:没有做“特殊”的事情,尝试使用vanilla PHP进行长时间轮询会占用资源,直到你杀死服务器为止。
这是基于PHP的基本长轮询的一个很好的基本指南,以及与“简单”道路相关的一些挑战: How do I implement basic "Long Polling"?
就这样做真的跨平台(并且简单到足以启动),您可能需要回退到某种简单的内部轮询 - 但目标应该是确保此操作的成本远低于进行客户调查。
一种方法是基本上对待它就像你正在缓存数据库调用(此时你正在进行),并使用一些标准的缓存方法。从APC到memcached,再到轮询文件,所有这些都可能比服务器设置和每秒拆除连接所需的负载更少。让一个进程将数据放在正确的密钥中,然后定期在脚本中轮询它们。
以下是对各种可能跨平台的缓存选项的非常好的概述: http://simas.posterous.com/php-data-caching-techniques
一旦达到这种方法的极限,您可能无论如何都必须转移到不同的服务器架构上。