CGI、FastCGI、PHP-FPM与Module模式

本文介绍了CGI、FastCGI和PHP-FPM的工作原理及其优缺点。CGI每次请求都会创建新的进程,导致性能低下。FastCGI作为CGI的改进版,通过常驻内存的进程管理提高性能,支持多种语言。PHP-FPM是PHP对FastCGI的具体实现,采用多进程模型,通过连接池优化数据库交互,提升性能。模块模式下,Apache直接集成PHP模块处理请求,但启动时加载所有模块可能导致资源浪费。

CGI

最早的Web服务器简单地响应浏览器发来的HTTP请求,并将存储在服务器上的HTML文件返回给浏览器,也就是静态HTML。随着对网站的需求日益复杂,一些语言开始能写出动态网站,但是服务器本身并不能直接解析这些文件,服务器自己不能做,只能交给第三方处理,但是要提前与第三方做好约定,我给你什么,然后你给我什么,就是我把请求参数发送给你,然后我接收你的处理结果,再返回给客户端。那这个约定就是 Common Gateway Interface,简称CGI。这个协议可以用PHP、Python、C/C++来实现。如PHP-CGI,就是对CGI协议的实现。

这里写图片描述

服务器与CGI程序的交互步骤:
WEB服务器将根据CGI程序的类型决定数据向CGI程序的传送方式,一般来讲是通过标准输入/标准输出流环境变量来与CGI程序间进行数据的传递。 如下图所示:

这里写图片描述

CGI程序通过标准输入(STDIN)标准输出(STDOUT)来进行输入输出数据。此外 CGI程序还通过环境变量来得到输入,操作系统提供了许多环境变量,它们定义了程序的执行环境,应用程序可以读取它们。Web服务器和CGI接口又另外设置了一些环境变量,用来向CGI程序传递一些重要的参数。

一些常用的CGI环境变量如:CONTENT_TYPE、CONTENT_LENGTH、HTTP_COOKIE、QUERY_STRING、REMOTE_HOST等,在PHP脚本中,都可以通过 $_SERVER[‘xxx’]来获取。这些CGI环境变量都是服务器程序

你遇到的问题是:**执行 `systemctl restart php-fpm` 时提示 `php-fpm.service` 不存在**。 这通常意味着: - 系统中没有安装 `php-fpm`; - 或者 `php-fpm` 的服务名不同(例如 `php82-php-fpm`); - 或者你使用的是 Apache `mod_php` 而不是 `php-fpm`。 --- ### ✅ 解决方案一:确认你是否安装了 `php-fpm` 运行以下命令查看是否安装了 `php-fpm`: ```bash rpm -qa | grep php-fpm ``` 或者: ```bash yum list installed | grep php-fpm ``` 如果没有任何输出,说明你还没有安装 `php-fpm`。 #### 🔧 安装 php-fpm(以 PHP 8.2 为例) ```bash yum install php-fpm -y ``` 如果你使用的是 Remi 仓库并启用了 PHP 模块,可以这样安装: ```bash yum install php-php-fpm -y ``` 或者指定版本: ```bash yum install php82-php-fpm -y ``` --- ### ✅ 解决方案二:确认 php-fpm 的服务名 有些发行版(如 CentOS 8、AlmaLinux)在使用 Remi 仓库时,服务名会变成: - `php82-php-fpm` - `php81-php-fpm` - `php-fpm`(默认) #### 🔧 查看服务名: ```bash systemctl list-unit-files | grep php ``` 你应该能看到类似如下输出: ``` php82-php-fpm.service enabled ``` #### 🔧 使用正确的服务名重启: ```bash systemctl restart php82-php-fpm ``` --- ### ✅ 解决方案三:确认你使用的是 php-fpm 还是 mod_php 如果你使用的是 Apache 的 `mod_php`(即 PHP 作为 Apache 模块加载),那么你根本不需要 `php-fpm`。 你可以通过以下方式确认: #### 🔧 查看 Apache 是否加载了 PHP 模块: ```bash httpd -M | grep php ``` 输出示例: ``` php_module (shared) ``` 这说明你使用的是 `mod_php`,而不是 `php-fpm`,所以无需重启 `php-fpm`。 #### 🔧 重启 Apache 即可生效 PHP 配置: ```bash systemctl restart httpd ``` --- ### ✅ 解决方案四:查看当前 PHP 是如何运行的 你可以创建一个 `phpinfo.php` 文件来查看 PHP 的运行方式: ```php <?php phpinfo(); ?> ``` 访问这个文件后,在输出中查找: ``` Server API ``` - 如果显示 `Apache 2.0 Handler`,说明你使用的是 `mod_php`。 - 如果显示 `CGI/FastCGI`,说明你使用的是 `php-fpm`。 --- ### 🧠 总结:php-fpm.service 不存在的可能原因 | 原因 | 解决方案 | |------|----------| | 未安装 php-fpm | 使用 `yum install php-fpm` 安装 | | 服务名不同(如 php82-php-fpm) | 使用正确的服务名重启 | | 使用的是 mod_php | 不需要 php-fpm,重启 Apache 即可 | | 系统不支持 systemd(如旧版 CentOS 6) | 使用 `service php-fpm restart` | --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值