【问题标题】:Is php scalable with reverse ajax long polling?php 是否可通过反向 ajax 长轮询进行扩展?
【发布时间】:2011-12-26 23:11:30
【问题描述】:

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

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

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

【问题讨论】:

  • 我自己没有这样做,但可以选择使用 js 套接字吗?也许也使用 node.js。浏览器中对 websocket 的原生支持正在改进,但我猜 jquery 插件会处理这个问题?
  • 我并没有真正考虑 websocket,因为它不受所有主要浏览器的支持。实际上,我已经研究过 node.js,但据我所知,它仍然相对较新,因此框架支持更加有限。我目前正在考虑使用 Django,这意味着我必须学习 python。我听说过有关该框架的好消息,但如果有办法解决性能问题,我仍然更喜欢使用 php。
  • 我肯定会重新考虑 node.js - 对运行 node.js 的服务器端口的简单 ajax 请求可能只是诀窍。

标签: apache comet long-polling reverse-ajax php


【解决方案1】:

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

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

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

jappix project 为例,这是一个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 分钟。由于用户仍在阅读同一页面(或喝咖啡、与朋友交谈、去度假而不关闭计算机等),我们可以越来越多地延迟下一次检查。是一种假设用户不是真正活跃的方式。请注意,您可以通过其他方式检测用户活动并更改重新安排时间。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 请给出一些理由而不是一行回答。
    猜你喜欢
    • 2011-07-15
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多