php5-fpm 针对长轮询的优化

php5-fpm 针对长轮询的优化

我正在用 PHP 设计一个聊天应用程序。我使用带有 php-fpm 环境的 nginx。问题是,在多个客户端连接后,PHP 脚本变得非常慢。

我只有几个 (5-10) 个客户端连接,长轮询设置为 30 秒。Nginx 可以即时提供静态内容(如图像或样式),但对于 PHP 脚本,加载需要近 5 秒钟。我使用 XDebug 来分析代码,但它告诉我,加载 5 秒钟的脚本只花了 100 毫秒,这令人困惑。

我认为 php5-fpm 将传入请求排队,这会导致此类延迟。使用长轮询时,我应该了解有关 php5-fpm 配置的一些信息吗?我想强调的是,当大约 5 个客户端使用聊天时,它会变得非常非常慢。

类似问题:http://forum.nginx.org/read.php?3,198958一个长时间运行的 PHP 脚本阻止所有其他 PHP 请求

这也可能相关:http://www.matt-knight.co.uk/2011/concurrent-php-sessions/

答案1

使用纯 php 构建实时应用程序不是一个很好的选择,特别是当您需要长轮询时。您可以进行一些调整,但迟早(例如,当有 150 个连接的客户端时),您将不得不更改您的架构。

此外,长轮询需要持续访问数据库,以便找出何时向用户发送了新消息。当您拥有超过 5 - 10 个用户时,这可能是一种过度操作,这可能是为什么在拥有 5 - 10 个客户端之后您的服务器开始变慢的原因。

我建议您为实时应用程序使用带有 socket.io 的独立 nodejs 服务器,它工作得很好,可以毫无问题地同时处理数千个连接。它包含出色的配置选项,还支持基于连接客户端功能的 websocket 或长轮询

你可以看看socket.io

另外,为了从 php 向 node.js 服务器发送消息(推送内容),你可以使用大象.io图书馆

答案2

也许你的 PHP-FPM 配置中没有足够的 worker。我在设置 php-fpm 配置时通常遵循此规则,使用动态的pm 配置而不是静止的

pm = dynamic

pm.max_spare_servers = total cpu cores

pm.start_servers = (0.25 * total cpu cores)

pm.min_spare_servers = (0.5 * total cpu copres)

pm.max_children = 64 

这个数字越高,pm.max_children它消耗的内存就越多,但你可以处理的并发连接就越多。如果你的内存不足,你应该考虑使用低环 pm.max_chidren 并切换到动态 pm 而不是静态 pm。

如果您选择在一经请求模式而不是 un动态的,为了使您的长轮询正常工作,请确保该值足够高: pm.process_idle_timeout = 45s;我通常将其保留为默认值 10 秒,但您应该尝试 30 秒,假设您的轮询窗口是 30 秒。

有关如何配置 PHP-FPM 的更多信息,您可以查看以下地址的官方文档:http://php.net/manual/en/install.fpm.configuration.php

相关内容