如何选用于服务器的 mod_php、FastCGI 或 PHP-FPM?

大多数管理员都知道,广泛使用的脚本语言 PHP 可以嵌入 HTML 并与所有主要的 Web 服务器一起使用。然而,鲜为人知的是,您可以在服务器上以不同的方式运行 PHP。最常见的选项是默认在 Apache HTTP 服务器中运行的 mod_php 模块。但是,如果您的主要目标是性能,则应考虑其他选项。 PHP-FPM(FastCGI 进程管理器)和 PHP FastCGI 各有利弊,但两者都可以加快 PHP 的性能。

1、mod_php

让我们从使用 mod_php 运行 Apache 开始。这个包几乎存在于每个 Linux 发行版的存储库中,因此安装它很容易,配置和管理软件也是如此。事实上,它的易用性可能是部署 mod_php 的主要原因。

使用 mod_php,PHP 解释器被“嵌入”在 Apache 进程中; Apache 不调用任何外部 PHP 进程,这意味着 Apache 和 PHP 可以更好地进行通信。但是,每个 Apache 子进程都必须加载 mod_php,这会导致用于提供静态资源(例如图像文件、CSS 和 JavaScript)所需的进程更大。

这种方法的另一个问题是它只适用于 Apache。这并不总是一个问题,因为 Apache 是您能找到的最完整的 Web 服务器,但是在小型虚拟专用服务器 (VPS) 上运行的网站或每天必须提供数百万页的大型网站可能需要不同的 Web可以比 Apache 更好地扩展或缩小的服务器,因此也需要一种不同的方式来运行 PHP。

优点:

易于安装和更新。
易于使用 Apache 进行配置。

缺点:

仅适用于 Apache。
强制每个 Apache 子进程使用更多内存。
需要重新启动 Apache 才能读取更新的 php.ini 文件。

2、FastCGI
FastCGI 是用于将交互式程序与 Web 服务器连接的通用协议。它是早期通用网关接口 (CGI,Common Gateway Interface) 的变体,它减少了与 Web 服务器和 CGI​​ 程序接口相关的开销,允许服务器一次处理更多页面请求。

Apache 可以以 mod_fcgid 的形式使用 FastCGI,其他流行的 Web 服务器,例如 lighttpd、nginx、Cherokee,甚至 Microsoft IIS,也可以使用 FastCGI。

使用 FastCGI,您可以设置多个版本的 PHP。当您有为 PHP 5.1 制作的旧网站与最新版本的 PHP 不兼容时,这尤其有用。使用 FastCGI,您可以将旧 PHP 提供给旧网站,同时为所有其他网站使用最新版本,这是 mod_php 无法实现的。

FastCGI 还利用 suexec 来支持不同用户使用他们自己的 PHP 实例。此功能对于提高共享环境中的安全性尤为重要,您可以让不同的用户分别管理自己的网站。 FastCGI 减少了 Web 服务器的内存占用,但仍为您提供整个 PHP 语言的速度和功能。

优点:

与许多网络服务器兼容。
比 mod_php 更小的内存占用。
更多的配置选项,包括多个 PHP 和 suexec。

缺点:

需要比 mod_php 更多的配置。
在 IT 社区中并不广为人知。

3、PHP-FPM
PHP-FPM 是将 PHP 与网络服务器一起使用的最新方法,它是另一种 PHP FastCGI 实现,具有一些附加功能,可用于在小型 VPS 和多台服务器上运行的网站。它可以与任何与 FastCGI 兼容的 Web 服务器一起使用。

PHP-FPM 使管理员能够在不丢失任何查询的情况下优雅地停止和启动 PHP 工作进程。这允许您逐步更新配置和二进制文件而不会丢失任何查询。您可以使用不同的 uid、gid 和 chroot 环境以及不同的 php.ini 选项启动工作程序。如果您使用加速器,您还可以在共享内存操作码缓存意外损坏的情况下对所有进程运行紧急重启。

优点:

与许多网络服务器兼容。
内存占用比 mod_php 小。
比 FastCGI 更多的配置选项。

缺点:

需要比 mod_php 更多的配置。
在 IT 社区中并不广为人知。
项目还比较年轻。

结论
我想不出一般规则或指南来告诉您什么是您或您的公司用来加速 PHP 的正确方法。就我个人而言,我在大多数服务器上使用 mod_php 是因为它的稳定性和众所周知的事实。我在小型 VPS 上使用 PHP-FPM,其中必须节省内存同时保持快速性能。要记住的重要一点是可用的各种不同的解决方案;在规划您的项目时,了解所有这些是至关重要的。

补充说明:

CGI模式在2000年或更早的时候用得比较多, 以前web服务器一般只处理静态的请求,如果碰到一个动态请求怎么办呢?web服务器会根据这次请求的内容,然后会fork一个新进程来运行外部c程序 (或perl脚本…), 这个进程会把处理完的数据返回给web服务器,最后web服务器把内容发送给用户,刚才fork的进程也随之退出。 如果下次用户还请求改动态脚本,那么web服务器又再次fork一个新进程,周而复始的进行。

mod_php是目前流行的模式,web服务 器可以内置perl解释器或php解释器。 也就是说这些解释器做成模块的方式,web服务器会在启动的时候就启动这些解释器。 当有新的动态请求进来时,web服务器就是自己解析这些perl或php脚本,省得重新fork一个进程,效率提高了。

FastCGI模式 是,web服务器收到一个请求时,他不会重新fork一个进程(因为这个进程在web服务器启动时就开启了,而且不会退出),web 服务器直接把内容传递给这个进程(进程间通信,但fastcgi使用了别的方式,tcp方式通信),这个进程收到请求后进行处理,把结果返回给web服务 器,最后自己接着等待下一个请求的到来,而不是退出。

转载请注明出处:https://www.onexin.net/mod_php-fastcgi-php-fpm/

相关文章:

1、如何选择PHP的 TS 和 NTS 版本选择
https://www.onexin.net/php-ts-nts/

2、概念了解:CGI,FastCGI,PHP-CGI与PHP-FPM 各公共网关接口介绍
https://www.onexin.net/cgifastcgiphp-cgiphp-fpm/

3、用 PHP 编写更好的正则表达式regex
https://www.onexin.net/php-regex/

4、PHP 版本 8.2,8.1,8.0,7.4
https://www.onexin.net/php-8_2-8_1-8_0-7_4/

5、PHP中的Liskov替换原则
https://www.onexin.net/php-liskov/

Leave a Reply