我第一次尝试长轮询。
在PHP脚本中,我有一个带有睡眠计时器的while-loop,它将脚本冻结10秒,然后它再次在数据库中寻找新内容。
我正在考虑性能和服务器/数据库负载/连接:
对于服务器来说,哪个更糟糕:许多get请求(ajax),还是许多DB连接的打开/关闭?是否以任何方式使用长轮询更好,但在每轮while循环中关闭并重新打开DB连接(以释放有限数量的连接)?
这并不像听起来那么简单:当扩展到更多的服务器时,以简单的"我应该或不应该"替代方案开始的事情会迅速增加复杂性。
在两种方法都碰壁之后,我们提出了一个代理方案,即使在廉价的共享主机上也能很好地工作:
- 运行一个简单代理脚本的单个实例,轮询数据库(在共享主机上,我们从一个cron作业开始,如果没有其他正在运行,则只启动一个实例,因此我们很容易在重新启动时存活下来)
- 让代理脚本将昂贵的DB轮询转换为更便宜的轮询:SysV SHM和文件系统中的标志文件都可以正常工作。代理应该保持其单个DB连接打开
- 让潜在的多个长轮询器检查代理标志。
这使得在并发轮询增加时实现较短的服务器端轮询间隔而不会遇到问题成为可能。