5

我正在一个网站上工作,该网站显示来自数据库的一些经常更改的数据(队列状态和聊天对话)。我当前的设置是 Apache/PHP/MySQL。自然,我想避免每 x 秒轮询一次服务器,因为这不能很好地扩展。我想做反向 ajax 长轮询,但是,我读到 Apache 不能很好地处理这个问题,因为它很快就会用完工作线程。还有许多其他的 Web 服务器可以解决这个问题:nginx、tor​​nado 等。但是,我的问题是,PHP 是我所知道的唯一服务器端脚本语言。此外,我已经编写了一些 PHP 脚本,所以如果可以的话,我想保留它们。只要我仍然可以使用 PHP,我就可以切换服务器。

但是在做了更多研究之后,我读到人们说 PHP(PHP-FPM?)也会为每个请求创建一个进程,这意味着如果我有成百上千个打开的连接,就会有成百上千个进程,这也将是一个问题。

我可以得出结论,没有很好的可扩展方法来使用 PHP 制作长轮询网站吗?我应该放弃 PHP 并学习另一种服务器脚本语言吗?我现在可以继续使用我当前的设置(Apache/PHP)开发长轮询,但我不希望脚本语言的选择在我部署时对我的系统的可伸缩性造成任何限制。所以我该怎么做?我对网络编程不是很有经验,所以如果有任何大师可以给我一些指示,我将不胜感激!谢谢!

4

2 回答 2

6

以 php-fpm 模式运行的 PHP 仍然存在限制,尤其是在您的代码占用大量内存的情况下。如果没有可用内存,您将无法运行数千个并行进程。但它通常比 mod_php 执行得更快,并且至少不需要 PHP 的 HTTP 请求由网络服务器处理,如果该网络服务器是 nginx,您将获得更多并行可用的 HTTP 请求。

使用 php-fpm 您还将有一个等待请求队列,这在临时大流量的情况下可能很有用,因为至少请求被排队,而不是被拒绝。

现在长轮询操作可以使用 nginx(或其他,这是一个例子),但不能使用 PHP。PHP 不是为长时间运行的服务器而构建的,每个请求都是一个新进程,它确实不是 KeepAlive 事物的正确选择。但是“ Divide ut regnes ”(分而治之)。您的长轮询任务可以在您的 PHP 应用程序附近运行,但没有您的 PHP 应用程序。

jappix 项目为例,这是一个 PHP 项目。但是你需要在某个地方放置一个 XMPP 服务器(比如 ejabberd),以及一个 BOSH 服务器,在端口 80 上使用 nginx 作为代理到该 BOSH 服务器(所以你在端口 80 上有 xmpp 聊天协议,通过 nginx 和 ejabberd,什么都没有PHP 方面)。然后问题是连接您的应用程序身份验证、识别等,这必须通过扩展 XMPP 服务器配置来完成(例如,它使用与您的 PHP 应用程序相同的 LDAP 服务器)。

您的第二个长轮询问题是队列的状态。您可能会为此找到一些 XMPP 扩展。或者您可以对队列执行常规 ajax 查询。避免 PHP 应用程序上出现大量 ajax 请求的有用技术之一是根据斐波那契数(这是一个示例)重新安排检查的 ajax 回调上的下一个 ajax 检查。所以第一次下一个 ajax 调用将在 1 分钟后安排,下一次 2 分钟,然后是 3m、5m、8m、13m、21m、34m、55m、89m、144m 等。这个想法是检查可能很重要新消息传入页面加载后 1 分钟。由于用户仍在阅读同一页面(或喝咖啡、与朋友交谈、去度假而不关闭他的计算机等),我们可以越来越多地延迟下一次检查。是一种假设用户不是真正活跃的方式。请注意,您可以通过其他方式检测用户活动并更改重新安排时间。

于 2012-02-19T17:08:18.000 回答
-1

PHP 也不适合长轮询、Comet 和反向 ajax 技术。你应该使用 Node.js

于 2013-05-20T13:52:49.157 回答