FastCGI和FPM有什么区别?

138

我正在尝试在macports上安装带有fpm的php。我在某个地方读到fpm代表FastCGI进程管理器。这是否意味着fastcgi和fpm是相同的?如果它们相同,那么为什么我们有两个不同的macports变体来安装php,即"php5 + fastcgi""php5 + fpm"

3个回答

97

FPM 是一个进程管理器,用于管理 PHP 中的 FastCGI SAPI(服务器 API)。

基本上,它取代了像 SpawnFCGI 这样的进程管理工具。它会根据当前负载自适应地生成 FastCGI 子进程(也就是需要时启动更多子进程)。

否则,它和 FastCGI 没有太大的运行差异(从请求开始到结束的请求管道是相同的)。 它只是为了让实现变得更加容易而存在。


8
php-fpm 的一个关键优势在于,一个 APC 缓存可被多个进程共享。而 fcgid 则是每个进程一个 APC 缓存。使用 fpm 可导致大量的内存节省,这样您可以利用节省下来的内存来生成更多的进程,服务更多的流量。 - cam8001
29
@cam8001:那完全不正确。你可以在SpawnFCGI中设置要生成多少进程,以及每个进程中的PHP子进程数量。所以生成一个拥有100个子进程的PHP进程,与使用拥有100个子进程的FPM是相同的... 然而,相反的情况是正确的。如果FPM被杀死(段错误等),整个工作进程都会死亡。在SpawnFCGI中,如果其中一个进程死亡,其他进程可以继续运行... 所以这并不明确哪种方法更好。这是不同的方法。FPM之所以推荐,并非出于技术原因,而是因为它实际上是核心的一部分,可以得到维护... - ircmaxell

62

安东尼所说的完全正确,但我想补充一点的是,你的经验很可能会展现出更好的性能和效率(这不是由于fpmfcgi之间的差别引起的,而更多地是由于你的httpd实现方式)。

例如,我有一台四核机器运行着lighttpd + fcgi非常顺畅。为了应对增长,我升级到了16核的机器,结果两件事情爆炸了:内存使用和段错误。我发现自己每30分钟重启lighttpd以保持网站运行。

我转换到了php-fpm 和nginx,内存使用从> 20GB降至2GB。段错误也消失了。经过一些研究,我发现在负载下,lighttpd和fcgi在多核机器上无法很好地配合,并且在某些情况下存在内存泄漏问题。

这是因为php-fpmfcgi更好吗?并非完全如此,但你通过php-fpm连接方式似乎比你使用fcgi服务要高效得多。


8
这些问题是否持续到了大约2017年4月? - Lord Loh.
2
建议您更新lighttpd和fpm的版本,如果在2018年6月之后仍然出现上述问题,请及时更新并分享给社区。 - Ima

11

将PHP作为CGI运行意味着您基本上告诉您的Web服务器PHP可执行文件的位置,然后服务器运行该可执行文件。

PHP FastCGI进程管理器(PHP-FPM)是用于PHP的另一种FastCGI守护程序,允许网站处理繁重的负载。 PHP-FPM维护池(可以响应PHP请求的工作者)来完成此操作。对于多用户PHP环境,PHP-FPM比传统的基于CGI的方法(如SUPHP)更快。

然而,两者都有利弊,应根据具体情况选择。我在fastcgi vs fpm链接中找到了有关如何选择在我的情况下使用哪种处理程序的信息,这很有帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接