如果我使用 PHP,如何解决 c10k 问题?
Posted
技术标签:
【中文标题】如果我使用 PHP,如何解决 c10k 问题?【英文标题】:How can I address c10k problem if I am using PHP? 【发布时间】:2011-09-03 08:26:24 【问题描述】:我正在决定应用程序的架构,其中“Http KeepAlive”和“长轮询”将用于更快的响应。 php 有什么可以解决 Tornado 为 c10k 做的问题吗?
我正在考虑使用 nginx + PHP-FPM。但是,对于 1000 个活动连接,不会有 1000 个 PHP-FPM 进程吗?
那么我认为我们将遇到与 Apache 相同的问题,即存在许多固定连接。不是吗?
编辑:我知道如果我只想要 HTTP KeepAlive,nginx 就足够了。但是,如果我也想要像龙卷风支持那样的长轮询怎么办? PHP中有没有类似的东西?
【问题讨论】:
【参考方案1】:我不明白你的意思。 c10k 与网络服务器(apache、nginx 等)有关,与 PHP 无关。
如果你使用 nginx,你不应该担心它
【讨论】:
不能高度推荐 nginx 必须在服务器上执行 PHP 才能为 PHP 页面提供服务器。 Nginx 只处理静态内容或将请求发送到其他进程。【参考方案2】:对于活动连接(例如,加载和运行已定义的 PHP 脚本),是的,将有与 活动 连接一样多的 PHP 进程。但是 KeepAlive 是关于 被动 连接的,Nginx 非常擅长处理资源使用率非常低的被动 KeepAlive 连接——即使是成千上万的连接。
Apache 的问题在于,在通常的 mod_php 和 mpm_prefork 配置中,每个连接都需要一个进程,即使它只是一个被动的 KeepAlive。这意味着事实上大多数 Apache 服务器确实 需要在内存中有一个 PHP 进程,即使连接是被动的,但如果你将 PHP 作为 FastCGI 运行,情况就不是这样了。如果您将 PHP 作为 FastCGI 运行并选择 mpm_worker,Apache 也可以处理大量被动连接,这将为每个连接创建一个更轻量级的线程,但它仍然不如 Nginx。
【讨论】:
【参考方案3】:我对此的回答是查看node.js,您指定了一个 100K 活动连接,只要您拥有正确的硬件,Node.js 就应该可以正常处理。
当建立连接时,节点不会产生新进程,套接字被放置在排队系统中,但它不是典型的排队系统,其中处理一个连接,然后处理下一个。
Node.js 在处理大量连接方面臭名昭著,HTTP 客户端库基于 Keep-Alive 传输方式,并且非常快速和强大。
我用过很多次,我必须说它非常易于使用,它基于用于 Chrome 中 javascript 的超快 Google V8 引擎,这意味着它非常快,你应该看看这个,你会发现它对这类事情是可行的。
Blog post about Plurk using Node.js Plurk handling 100.000+ open Connections【讨论】:
以上是关于如果我使用 PHP,如何解决 c10k 问题?的主要内容,如果未能解决你的问题,请参考以下文章