使用Apache上的PHP进行长轮询

9
希望我能解释清楚。我正在以面向对象的方式创建一个用于通过PHP处理ajax请求的PHP库。目前,我正在考虑实现长轮询解决方案的好方法,但是有些疑问。 Apache无法很好地处理保持多个连接。每个请求对应一个线程的模型使得Apache对于长轮询非常低效。使用像nginx和lighttpd这样的服务器更好地处理这些线程,因此在该库中,我计划从单个函数调用中实现针对特定服务器进行优化的不同函数。对于占据PHP应用程序巨大市场份额的Apache而言,我需要更好的解决方案。
是否有一种方法可以将传入的请求暂停/挂起,并继续处理其他请求,直到我准备重新激活它?
我不确定这是否有意义,或者我是否走在正确的道路上。SO推荐用于在Apache服务器上使用PHP进行长轮询的可能解决方案是什么?

为什么要在服务器上暂停处理?这不会让用户等待很久吗? - Joseph
使用 Apache,它使用一个请求对应一个线程的模型,因此应用程序中的初始页面请求将使用一个线程,然后 AJAX 请求(在 DOM 加载后调用)将使用一个单独的线程。问题是尝试处理高流量将会产生数千个线程,并最终使服务器不可用。 - Jeremy Harris
我们曾经遇到过类似的问题,打开ajax/PHP长轮询后,页面加载开始随机(大约每4-5次加载)花费太多时间...目前只针对通知,我通过在任何情况下都不使用PHP中的sleep()来解决它,并将timewait功能移动到javascript中,所以现在javascript每10秒请求一次新的PHP执行,但页面加载似乎现在没问题了。 - jave.web
2个回答

2

这听起来像是continuations(续延)。在PHP中,你绝对不能以任何优雅的方式实现这一点。如果你想要这样做,最好的机会是保存当前状态,并编写代码,使你可以在加载状态时从上次离开的地方继续执行。


我开始得出相同的结论。我想我只需要实现一个基本的长轮询解决方案,并在文档/注释中注明它在某些服务器环境下不是最佳选择。这样,如果有人想尝试使用它,基本功能已经存在。 - Jeremy Harris

0

我认为没有解决方案。你无法区分轮询请求和普通请求。只有避免使用Apache可能会有所帮助(例如在80上运行nginx,将所有请求转发到81上的Apache,除了轮询请求)。

我也不认为你有问题。Nginx或其他服务器并不比Apache更有效率。轮询是一个PHP请求,带有mod_php的Apache是一个较好的选择。在提供PHP服务方面,Nginx不会比Apache使用更少的资源。


4
“Nginx在提供PHP服务方面不会比Apache使用更少的资源。” 你确定吗?http://serverfault.com/questions/157520/apache-vs-nginx - Jeremy Harris
当然。我在那个网址上没有看到任何相反的声明。“mod_php比php-fpm稍微快一点”,“cgi比mod_php慢得多”等等。当然,这都取决于您长轮询与正常PHP文件/静态文件的使用量,是否有缓存反向代理,以便Apache不会受到静态文件的干扰,以及您在Apache中使用了多少模块... - jcisio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接