我正在一个网站上显示来自DB的一些数据,这些数据经常变化(队列状态和聊天对话)。我目前的设置是Apache / PHP / MySQL。当然,我希望避免每x秒轮询一次服务器,因为这不能很好地扩展。我想做反向ajax长轮询,但是,我已经读过Apache不能正常工作,因为它很快就会耗尽工作线程。还有很多其他的Web服务器来解决这个问题:nginx,龙卷风等等。但是,我的问题是,PHP是我所知道的唯一的服务器端脚本语言。此外,我已经编写了一些PHP脚本,所以如果可以,我想保留它们。只要我仍然可以使用PHP,我就可以切换服务器。
但在做了一些研究之后,我读过人们说PHP(PHP-FPM?)也为每个请求创建了一个进程,这意味着如果我有数百/数千个开放连接,那么将有数百个/成千上万的流程,这也是问题。
我可以得出结论,使用PHP制作长轮询网站没有很好的可扩展方法吗?我应该放弃PHP并学习另一种服务器脚本语言吗?我现在可以继续使用我当前的设置(Apache / PHP)开发长轮询,但我不希望在部署时选择脚本语言对我的系统的可伸缩性造成任何限制。所以我该怎么做?我对网络编程不是很有经验,所以如果有任何大师可以给我一些指示我会很感激!谢谢!
答案 0 :(得分:7)
在php-fpm模式下运行的PHP仍然有局限性,特别是如果你的代码占用了大量内存。没有一些可用内存,您将无法运行数千个并行进程。但它通常比mod_php执行得更快,并且至少不需要PHP的HTTP请求由网络服务器处理,如果该网络服务器是nginx,你将获得更多并行的HTTP请求。
使用php-fpm,您还将拥有一个等待请求队列,这可能对临时大流量有用,因为至少请求已排队,但不会被拒绝。
现在使用nginx(或其他人,这是一个例子)可以进行长轮询操作,但不能使用PHP。 PHP不是一个长期运行的服务器,每个请求都是一个新进程,它实际上不是KeepAlive的正确选择。但是“划分界限”(分而治之)。您的长轮询任务可能在您的PHP应用程序附近运行,但没有您的PHP应用程序。
以jappix project为例,这是一个PHP项目。但是你需要把一个XMPP服务器(比如ejabberd)和一个带有nginx的BOSH服务器作为端口80的代理服务器放到那个BOSH服务器上(所以你在端口80上有xmpp聊天协议,通过nginx和ejabberd,什么都没有PHP的一面)。问题是连接您的应用程序验证,识别等,这必须通过扩展XMPP服务器配置来完成(例如,它使用与PHP应用程序相同的LDAP服务器)。
您的第二个长轮询问题是队列的状态。您可能会找到一些XMPP扩展名。或者您可以在队列上执行常规的ajax查询。避免PHP应用程序上大量的ajax请求的有用技巧之一是根据Fibonacci数字重新安排检查的ajax回调的下一个ajax检查(这是一个例子)。因此,第一次下一次ajax呼叫将在1分钟后,下一次2分钟,然后3米,5米,8米,13米,21米,34米,55米,89米,144米等安排。这个想法是,检查它可能很重要页面加载后1分钟新消息传入由于用户仍然在阅读同一页面(或喝咖啡,与朋友交谈,在不关闭计算机的情况下去度假等),我们可以延迟越来越多的下一次检查。是一种假设用户不是真正活跃的方式。请注意,您可以通过其他方式检测用户活动并更改重新安排。
答案 1 :(得分:-1)
PHP不适合长轮询,Comet和反向ajax技术。你应该使用Node.js