我正在用PHPdevise一个聊天应用程序。 我使用php-fpm环境下的nginx。 问题是,多个客户端连接后,PHP脚本变得非常慢。
我只有几个(5-10)客户端连接,长轮询被设置为30秒。 Nginx可以立即提供图片或样式等静态内容,但对于PHP脚本来说,加载需要将近5秒的时间。 我使用XDebug来剖析代码,但它告诉我,加载了5秒的脚本只花了100ms,这是令人困惑的。
我认为php5-fpm队列传入的请求,这导致这样的延迟。 有什么我应该知道关于php5-fpmconfiguration使用长轮询时? 我想强调的是,当有5个客户正在使用聊天时,会变得非常慢。
类似的问题: http : //forum.nginx.org/read.php?3,198958 ( 一个长时间运行的PHP脚本阻止所有其他的PHP请求 )
这也可能是连接: http : //www.matt-knight.co.uk/2011/concurrent-php-sessions/
build立与裸露的PHP实时应用程序不是一个很好的select,特别是当你需要长时间轮询。 你可以做一些调整,但迟早(例如在150个连接的客户端),你将不得不改变你的架构。
同样,长时间轮询需要持续访问数据库,以便找出何时发送了用户的新消息。 这可能是一个矫枉过正,当你有超过5 – 10个用户,这可能是5 – 10客户端后,你的服务器开始变慢。
我build议你使用一个独立的nodejs服务器,socket.io作为实时应用程序,它的工作很好,它可以同时连接数千个没有问题。 它包含出色的configuration选项,并且还支持基于连接客户端function的websockets或长轮询
你可以看看socket.io
另外,为了将消息(推送内容)从php发送到node.js服务器到node.js服务器,您可以使用elephant.io库
也许你在PHP-FPMconfiguration中没有足够的工人。 我通常在设置我的php-fpmconfiguration时遵循这个规则,使用dynamic的 pmconfiguration而不是静态的 :
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,然后切换到dynamic的pm而不是静态的。
如果您select在按需模式下设置您的pm,而不是未dynamic ,为了让您的长轮询工作,推动确保这个值足够高: pm.process_idle_timeout = 45s; 我平时把它留在默认的10秒,但你可以尝试30秒,假设你的投票窗口是30秒。
有关如何configurationPHP-FPM的更多信息,可以查看以下地址的官方文档: http : //php.net/manual/en/install.fpm.configuration.php