fastcgi协议与php通信的简单介绍

发布时间:2022-11-13

本文目录一览:

  1. 关于FastCGI、php-cgi、php-fpm的区别是什么,各自有什么用途,以及相互间的关系是什么?
  2. 如何配置apache以fastcgi模式运行php
  3. 如何通俗的解释cgi,fastcgi,php-fpm之间的关系
  4. phpinfo的Server API为CGI/FastCGI是什么模式
  5. php中fastcgi和php-fpm是什么东西
  6. 如何通俗地解释 CGI,FastCGI,php-fpm 之间的关系

关于FastCGI、php-cgi、php-fpm的区别是什么,各自有什么用途,以及相互间的关系是什么?

FastCGI 是一个通用网关接口,用于 Web 服务器(如 IIS、Apache)和应用程序通信。 php-cgi 是 PHP 平台的 CGI 程序。 以上两个结合,可以使 PHP 整合在 Web 服务中。 php-fpm 是一个独立的 php-fcgi 管理软件,它要整合进 Web 服务中,需要使用代理模式。 一般与 Nginx 搭配,也可以与 Apache 搭配。 php-fpm 一般不直接作为服务容器提供外网访问,而是通过常用 Web 容器作代理。 PHP 作为服务器端的解析程序,运行模式分很多种,如 fastcgi、mod_php、proxy(代理)等。 与 IIS 搭配时一般采用 fast-cgi 模式,IIS 自带 fast-cgi 引擎,配置好 PHP 参数即可。 与 Apache 搭配,在 Windows 平台下,一般也是 fast-cgi 模式;在 Linux 系统中一般是 mod_php 模式,把 PHP 作为一个子模块加载。 也可以配置 php-fpm,然后在 Apache 中配置代理模式。 与 Nginx 搭配,一般就是用 php-fpm + 代理模式了。

如何配置 Apache 以 FastCGI 模式运行 PHP

第一步:下载安装的文件

  1. Apache 版本 httpd-2.2.21-win32-x86-no_ssl.msi
  2. mod_fcgid 版本 mod_fcgid-2.3.6-win32-x86.zip
  3. MySQL 版本 mysql-5.5.19-win32.msi
  4. PHP 版本 php-5.3.5-nts-Win32-VC6-x86.zip

提示:

  1. 建议选择无 SSL 功能的 Apache 版本来完成开发,我们这里使用了 httpd-2.2.21-win32-x86-no_ssl.msi
  2. 建议选择由 Apache 官方所提供的 mod_fcgid 作为 FastCGI 模块。我们这里使用目前最新版本 2.3.6。
  3. Windows 下安装 MySQL 就选择 .msi 安装包格式,我们选择了 mysql-5.5.19-win32.msi,双击根据向导安装即可,简单方便。
  4. PHP 我们选择用 php-5.3.5-nts-Win32-VC6-x86.zip 这个版本。这个是 nts(非线程安全)版本,是针对 PHP 的 FastCGI 安装方式。

第二步:安装文件

  1. 在要安装的磁盘建一个文件夹。为了以后管理方便我们在 D 盘的根目录下创建一个 WAMP 文件夹:D:\WAMP(WAMP 是 Windows + Apache + MySQL + PHP 的缩写)。
  2. 在 WAMP 文件夹下创建一个 WWW 文件夹,用来存放你的 PHP 网站程序:D:\WAMP\WWW
  3. 安装 Apache 服务器,把 Apache 服务器安装到 D:\WAMP\Apache 文件夹。
  4. 把下载的 php-5.3.5-nts-Win32-VC6-x86 解压到 D:\WAMP\PHP 文件夹。
  5. 安装 MySQL 数据库,把 MySQL 安装到 D:\WAMP\MySQL 文件夹。

第三步:配置 Apache

使用文本编辑工具(推荐 EditPlus)打开 D:\WAMP\Apache\conf\httpd.conf 文件,这个文件是 Apache 的配置文件。

1. 设置监听端口

找到 Listen(大概在第 46 行),将它后面的数字改为 8080

Listen 8080

2. 修改网站存放目录

查找 DocumentRoot,将其修改为指向网站目录的正确文件夹:

DocumentRoot "D:/WAMP/www"

同时,查找 Directory 默认的 DocumentRoot,将其修改为你自己配置的路径:

<Directory "D:/WAMP/www">

3. mod_fcgid 配置

将下载的 mod_fcgid-2.3.6-win32-x86.zip 压缩包中的 mod_fcgid.so 文件复制到 Apache 的 modules 目录。 在 httpd.conf 文件最后加入如下配置:

LoadModule fcgid_module modules/mod_fcgid.so
<IfModule mod_fcgid.c>
    AddHandler fcgid-script .fcgi .php
    FcgidInitialEnv PHPRC "D:/WAMP/PHP"
    FcgidInitialEnv PHP_FCGI_MAX_REQUESTS 1000
    FcgidMaxRequestsPerProcess 1000
    FcgidMaxProcesses 5
    FcgidIOTimeout 120
    FcgidIdleTimeout 120
    FcgidWrapper "D:/WAMP/PHP/php-cgi.exe" .php
    AddType application/x-httpd-php .php
</IfModule>

修改 DocumentRoot 路径的配置为:

<Directory "D:/WAMP/WWW">
    Options Indexes FollowSymLinks ExecCGI
    Order allow,deny
    Allow from all
    AllowOverride All
</Directory>

4. 修改目录首页文件

在配置文件 httpd.conf 中查找 DirectoryIndex index.html,将其修改成:

DirectoryIndex index.html index.htm index.php

第四步:配置 PHP

打开 PHP 安装目录,即 D:\WAMP\PHP,我们可以看到目录下有两个这样的文件:php.ini-developmentphp.ini-production。第一个是开发使用的配置文件,第二个是生产环境的配置。因为我们是在本机做开发,所以选择前者。将 php.ini-development 复制一份到同目录下,并改名为 php.ini

1. 指定 PHP 扩展库的存放目录

php.ini 文件中查找 extension_dir = "ext",将其修改为:

extension_dir = "D:/WAMP/PHP/ext"

2. 开启相应的扩展库

查找 ; Windows Extensions,在它的下面是 extension 列表。 找到如下扩展:

;extension=php_curl.dll
;extension=php_gd2.dll
;extension=php_mbstring.dll
;extension=php_exif.dll
;extension=php_mysql.dll
;extension=php_mysqli.dll
;extension=php_pdo_mysql.dll
;extension=php_pdo_odbc.dll
;extension=php_sockets.dll
;extension=php_xmlrpc.dll
;extension=php_xsl.dll

去掉前面的分号 ;

3. 让 PHP 支持短标签

php.ini 配置文件中查找 short_open_tag = Off,将其修改为:

short_open_tag = On

4. 配置 PHP 的 Session 功能

php.ini 配置文件中查找 ;session.save_path = "/tmp",去掉前面的分号 ;,改为:

session.save_path = "D:/WAMP/sessiontmp"

如何通俗的解释 CGI,FastCGI,php-fpm 之间的关系

这个问题可以分两个层面讨论:

  1. PHP 解释器是否嵌入 Web 服务器进程内部执行
    • mod_php 通过嵌入 PHP 解释器到 Apache 进程中,只能与 Apache 配合使用。
    • CGIFastCGI 以独立的进程形式出现,只要对应的 Web 服务器实现 CGI 或者 FastCGI 协议,就能够处理 PHP 请求。
    • mod_php 这种嵌入的方式最大的弊端就是内存占用大,不论是否用到 PHP 解释器都会将其加载到内存中。
  2. 单个进程处理的请求数量
    • mod_phpFastCGI 的模式在每个进程的生命周期内能够处理多个请求。
    • CGI 的模式处理一个请求就马上销毁进程,在高并发的场景下性能非常糟糕。 综上,如果对性能有极高的要求,可以将静态请求和动态请求分开,这时 Nginx + php-fpm 是比较好的选择。 PS: CGI、FastCGI 通常指 Web 服务器与解释器通信的协议规范,而 php-fpm 是 FastCGI 协议的一个实现。

phpinfo 的 Server API 为 CGI/FastCGI 是什么模式

让 Web 服务器(如 IIS、Apache、Nginx 等)支持 PHP 的方式有两种:

  1. 通过模块加载的方式,适用于 Apache。
  2. 通过 CGI/FastCGI 模式,该模式一般 Web 服务器都是支持的。 FastCGI 是 Web 服务器和处理程序之间通信的一种协议,是 CGI 的一种改进方案。FastCGI 像是一个常驻型的 CGI,它可以一直执行,在请求到达时不会花费时间去 fork 一个进程来处理(这是 CGI 最为人诟病的 fork-and-execute 模式)。 FastCGI 不只是一个通信协议,还支持分布式的运算,即 FastCGI 程序可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。

php 中 fastcgi 和 php-fpm 是什么东西

首先要明白 CGI 是一个协议,方便程序员开发程序的。 而 FastCGI 是 CGI 的一个改良版,优化了 CGI 的性能。 php-fpm 是实现了 FastCGI 的一个程序(当然,被官方收录了)。 php-fpm 是 PHP 的一种工作模式。以服务的形式接收服务器传来的 PHP 文件,处理返回。 PHP 一般还会以 Apache 模块的形式工作。

如何通俗地解释 CGI,FastCGI,php-fpm 之间的关系

CGI 是 HTTP Server 和一个独立的进程之间的协议,把 HTTP Request 的 Header 设置成进程的环境变量,HTTP Request 的正文设置成进程的标准输入,而进程的标准输出就是 HTTP Response 包括 Header 和正文。 FastCGI 是和 HTTP 协议类似的概念。无非就是规定了在同一个 TCP 连接里怎么同时传多个 HTTP 请求。这实际上导致了一个问题,有个 HTTP 连接传个大文件不肯让出 FastCGI 连接,在同一个 FastCGI 连接里的其他 HTTP 连接就傻了。所以 Lighttpd 引入了 X-SENDFILE。 php-fpm 就相当于是 Apache + mod_php。无非 php-fpm 自带了 FastCGI Server,而 Apache 是 HTTP Server。 WSGI 和这个问题没啥关系。WSGI 只是 Python 内部的一个接口。无论你前面是 FastCGI、HTTP、SCGI、uWSGI 等协议,你的 FastCGI/HTTP/SCGI/uWSGI Server 都以相同的参数格式去调用一个函数,这样你用 Python 写的 Web 应用并不需要修改代码,就可以运行在不同的 Server 后面了。无非 CGI 协议是进程间的,而 WSGI 是进程内的。