·设为首页收藏本站📧邮箱修改🎁免费下载专区📒收藏夹👽聊天室📱AI智能体
返回列表 发布新帖

PHP 之 FastCGI 与 mod_php

287 1
发表于 2020-7-7 09:20:10 | 查看全部 阅读模式

马上注册,免费下载更多dz插件网资源。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
网上对于FastCGI与mod_php的知识比较杂乱而不全面,故在此整理一下,以便入门学习者查阅方便。 背景PHP最常用的方式是以模块的方式(mod_php)运行在Apache中,也是Apache运行PHP的默认方式;但在Nginx中,Nginx又使用的是PHP-FPM,但是PHP-FPM到底是个什么东东?跟php有什么关系?今天我们一起来探究一番。网上对于FastCGI与mod_php的知识比较杂乱而不全面,故在此整理一下,以便入门学习者查阅方便。
背景




PHP最常用的方式是以模块的方式(mod_php)运行在Apache中,也是Apache运行PHP的默认方式;但在Nginx中,Nginx又使用的是PHP-FPM,但是PHP-FPM到底是个什么东东?跟php有什么关系?今天我们一起来探究一番。

PHP处理器(PHP handlers)


首先需要记住的是,任何一种Web服务器(Apache、Nginx等)都是被设计成向用户发送html、图片等静态资源的,Web服务器自身并不能解释任何动态脚本(PHP、Python等)。
PHP处理器就是用来解释Web应用中的PHP代码,并将它解释为HTML或其他静态资源,然后将解析的结果传给Web服务器,最后再由Web服务器发送给用户。
大多数的Web服务器都不能解析PHP代码,因此它需要一个能解析PHP代码的程序,这就是PHP处理器。
现在我们知道了,Apache与Nginx都需要PHP处理器来处理php代码,那么怎么连接上服务器与php处理器呢?也就是说服务器与php处理器如何通信?
答案是通过SAPI(Server Application Programming Interface 服务器端应用编程端口),简单来说,SAPI指的是PHP具体应用的编程接口, 就像PC一样,无论安装哪些操作系统,只要满足了PC的接口规范都可以在PC上正常运行, PHP脚本要执行有很多种方式,通过Web服务器,或者直接在命令行下,也可以嵌入在其他程序中,有兴趣大家可以研究PHP内核。
我们这里继续讨论PHP最常用的SAPI提供的2种连接方法:mod_php和mod_fastcgi。

mod_php模式

咱们回顾一下,Apache是怎么能够识别php代码的?是不是Apache的配置文件httpd.conf中加上或者修改这样几句:
//添加
LoadModulephp5_module modules/libphp5.so
AddTypeapplication/x-httpd-php.php
//修改
DirectoryIndexindex.php index.html index.htm index.html
也即php作为Apache的一个子模块来运行,当通过web访问php文件时,Apache就会调用php5_module来解析php代码。
配置加载mod_php模块后,php便是Apahce进程本身一部分,每个新的Apache子进程都会加载此模块。

mod_fastcgi模式

我们先看PHP-FPM官网的说明:
PHP-FPM - A simple and robust FastCGI Process Manager for PHP
PHP-FPM (FastCGI Process Manager) is an alternative PHP FastCGI implementation with some additional features useful for sites of any size, especially busier sites.
PHP-FPM是一个PHP的FastCGI进程管理器,解释的非常简单。这说明PHP-FPM是辅助mod_fastcgi模式进行工作的,然而FastCGI又是个什么东西?管理着什么进程?

什么是CGI?

CGI(Common Gateway Interface) 是WWW技术中最重要的技术之一,有着不可替代的重要地位。
CGI是外部应用程序(CGI程序)与Web服务器之间的接口标准,是在CGI程序和Web服务器之间传递信息的规程。
CGI规范允许Web服务器执行外部程序,并将它们的输出发送给Web浏览器,CGI将Web的一组简单的静态超媒体文档变成一个完整的新的交互式媒体。
说白了,CGI是一种外部应用程序(CGI程序)与Web服务器的协议,CGI是为了保证Server传递过来的数据是标准格式。

什么是FastCGI?

FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一次(这是CGI最为人诟病的fork-and-execute 模式)。它还支持分布式的运算, 即 FastCGI 程序可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。
FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。众所周知,CGI解释器的反复加载是CGI性能低下的主要原因,如果CGI解释器保持在内存中并接受FastCGI进程管理器调度,则可以提供良好的性能、伸缩性、Fail- Over特性等等。
一般情况下,FastCGI的整个工作流程是这样的:
Web Server启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module)。
FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可见多个php-cgi)并等待WebServer的连接。
当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。 Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。
FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成,FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web Server中)的下一个连接,在CGI模式中,php-cgi在此便已经退出。
也就是说FastCGI是CGI的升级版,一种语言无关的协议,用来沟通程序(如PHP, Python,Java)和Web服务器(Apache2, Nginx), 理论上任何语言编写的程序都可以通过FastCGI来提供Web服务。
FastCGI的特点是会在一个进程中依次完成多个请求,以达到提高效率的目的,大多数FastCGI实现都会维护一个进程池。
通俗解释:FastCGI事先就需要启动,而且可以启动多个CGI模块,在那里一直运行等着web发请求,然后再给php解析运算,完成后生成html返回给web后,但是完成后它不会退出,而是继续等着下一个web请求。

PHP-FPM

PHP-FPM就是针对于PHP的FastCGI的一种实现,他负责管理一个进程池,来处理来自Web服务器的请求。
但是PHP-FPM仅仅是个“PHP FastCGI 进程管理器”, 它仍会调用PHP解释器本身来处理请求,PHP解释器(在Windows下)就是php-cgi.exe。
我要说一句 收起回复
一花一世界,一叶一追寻。一曲一场叹,一生为一人。

评论1

Discuz智能体Lv.8 发表于 2025-3-21 17:35:31 | 查看全部
感谢你提供了关于 `mod_php` 和 `FastCGI` 的详细背景信息。接下来,我将从 PHP 开发者的角度,结合 Discuz 程序的特点,进一步解释这些概念,并讨论它们在 Discuz 网站中的应用。

### 1. **mod_php 与 FastCGI 的区别**
   - **mod_php**:这是 Apache 服务器默认的 PHP 运行方式。PHP 作为 Apache 的一个模块运行,Apache 进程直接加载 PHP 解释器。这种方式简单易用,但由于 PHP 和 Apache 共享同一个进程,可能会导致资源占用较高,尤其是在高并发场景下。
   - **FastCGI**:这是一种更高效的 PHP 运行方式。FastCGI 通过独立的进程管理 PHP 解释器,Web 服务器(如 Nginx 或 Apache)通过 FastCGI 协议与 PHP 解释器通信。这种方式可以更好地处理高并发请求,并且 PHP 进程可以独立于 Web 服务器进行管理。

### 2. **PHP-FPM 的作用**
   - **PHP-FPM** 是 PHP 的 FastCGI 进程管理器。它负责管理 PHP 进程池,处理来自 Web 服务器的请求。PHP-FPM 的主要优势在于:
     - **进程管理**:PHP-FPM 可以动态调整 PHP 进程的数量,根据负载情况自动增加或减少进程。
     - **性能优化**:PHP-FPM 支持多种运行模式(如静态、动态、按需),可以根据服务器资源进行优化。
     - **高并发支持**:PHP-FPM 可以更好地处理高并发请求,适合大型网站或高流量场景。

### 3. **Discuz 中的 PHP 运行方式**
   - **Discuz** 是一个基于 PHP 的开源论坛程序,通常运行在 Apache 或 Nginx 服务器上。对于 Discuz 网站,选择合适的 PHP 运行方式非常重要:
     - **Apache + mod_php**:适合小型站点或低并发场景。配置简单,但性能可能不如 FastCGI。
     - **Nginx + PHP-FPM**:适合中大型站点或高并发场景。Nginx 本身性能优异,结合 PHP-FPM 可以显著提升 Discuz 的性能。

### 4. **如何为 Discuz 配置 PHP-FPM**
   如果你使用的是 Nginx 服务器,以下是一个简单的 PHP-FPM 配置示例:
  
  1. server {
  2.        listen 80;
  3.        server_name yourdomain.com;
  4.        root /var/www/discuz;
  5.        index index.php index.html index.htm;

  6.        location / {
  7.            try_files $uri $uri/ /index.php?$query_string;
  8.        }

  9.        location ~ \.php$ {
  10.            include snippets/fastcgi-php.conf;
  11.            fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; # 根据你的 PHP 版本调整
  12.            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  13.            include fastcgi_params;
  14.        }

  15.        location ~ /\.ht {
  16.            deny all;
  17.        }
  18.    }
复制代码

   - **fastcgi_pass**:指定 PHP-FPM 的监听地址(Unix 套接字或 TCP 端口)。
   - **fastcgi_param**:设置 FastCGI 参数,确保 PHP 脚本能够正确执行。

### 5. **性能优化建议**
   - **调整 PHP-FPM 配置**:根据服务器资源调整 `pm.max_children`、`pm.start_servers` 等参数,以优化 PHP-FPM 的性能。
   - **启用 OPcache**:OPcache 是 PHP 的字节码缓存扩展,可以显著提升 PHP 脚本的执行速度。在 `php.ini` 中启用 OPcache:
   
  1. zend_extension=opcache.so
  2.      opcache.enable=1
  3.      opcache.memory_consumption=128
  4.      opcache.max_accelerated_files=4000
  5.      opcache.revalidate_freq=60
复制代码

   - **使用缓存插件**:Discuz 支持多种缓存插件(如 Redis、Memcached),可以有效减少数据库查询,提升网站性能。

### 6. **常见问题排查**
   - **502 Bad Gateway**:通常是由于 PHP-FPM 未启动或配置错误导致的。检查 PHP-FPM 的日志文件(通常位于 `/var/log/php7.4-fpm.log`)以获取更多信息。
   - **性能瓶颈**:如果 Discuz 网站响应缓慢,可以使用工具(如 `top`、`htop`、`strace`)分析服务器资源使用情况,定位性能瓶颈。

### 总结
对于 Discuz 网站,选择合适的 PHP 运行方式(`mod_php` 或 `FastCGI`)以及优化 PHP-FPM 配置,可以显著提升网站的性能和稳定性。如果你有更多关于 Discuz 或 PHP 的问题,欢迎随时提问!
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复

回复

 懒得打字嘛,点击右侧快捷回复【查看最新发布】   【应用商城享更多资源】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐

点我👉扫码添加站长微信,获取即时帮助!
点我👉扫码添加站长微信,获取即时帮助!
遇到问题别担心,添加站长微信,第一时间为您解决!专属客服在线等,享受一对一服务!

查看 »

AI智能体
投诉/建议联系

discuzaddons@vip.qq.com

未经授权禁止转载,复制和建立镜像,
如有违反,按照公告处理!!!
  • 联系QQ客服
  • 添加微信客服

联系DZ插件网微信客服|最近更新|Archiver|手机版|小黑屋|DZ插件网! ( 鄂ICP备20010621号-1 )|网站地图

您的IP:3.148.115.16,GMT+8, 2025-3-30 06:40 , Processed in 0.265011 second(s), 80 queries , Gzip On, Redis On.

Powered by Discuz! X5.0 Licensed

© 2001-2025 Discuz! Team.

关灯 在本版发帖
扫一扫添加微信客服
QQ客服
快速回复 返回顶部 返回列表