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