我正在使用 AJAX 在页面上实现长轮询,每当将新行插入数据库时,我想更新该页面。完成此操作的方法是使用 jQuery.ajax()
调用,例如,poll.php?ky=41
它会多次查询数据库中 ID 为> 41
(中间有一小段等待)的行,直到指定的超时。如果有结果,或者在给定的超时之后,它将立即完成请求。
实际上,这使隐藏的连接始终对服务器打开,等待它响应,以便获得通知。
这行得通,但我使用的是 DreamHost,并且在php53.cgi
生成了 8 个工作进程之后,直到一次超时,对我的站点的请求都没有得到满足(即永远加载)。这会影响我网站上的所有其他页面。HTTP 服务器是 Apache 2.2.22-14。
为了缓解这个问题,我减少了延迟和超时,使其更接近常规轮询,并在一段时间没有更新时增加了更长的延迟。这意味着通知可能会晚几秒钟,但到目前为止我的服务器运行良好。
我担心的是这将扩展得有多好(或者更确切地说,有多差)。
我的问题是:鉴于我在共享主机(DreamHost)上,并且此页面必须与尽可能多的浏览器兼容(移动设备除外),是否有更有效的方式从服务器获取即时“推送”通知?
或者,我还有什么其他选择?我应该切换回常规投票吗?
TL; 博士
轮询很快,但是长轮询(在完成 AJAX 请求之前等待)占用资源。不同的是,长轮询一到就会得到结果,而轮询只会在新信息进来后下一次发送 AJAX 请求时才取到它。理想情况下,我希望长轮询的优势不会占用线程并导致其他用户在提供页面之前等待。