本文目录一览:
- 关于FastCGI、php-cgi、php-fpm的区别是什么,各自有什么用途,以及相互间的关系是什么?
- 如何配置apache以fastcgi模式运行php
- 如何通俗的解释cgi,fastcgi,php-fpm之间的关系
- phpinfo的Server API为CGI/FastCGI是什么模式
- php中fastcgi和php-fpm是什么东西
- 如何通俗地解释 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
第一步:下载安装的文件
- Apache 版本
httpd-2.2.21-win32-x86-no_ssl.msi
- mod_fcgid 版本
mod_fcgid-2.3.6-win32-x86.zip
- MySQL 版本
mysql-5.5.19-win32.msi
- PHP 版本
php-5.3.5-nts-Win32-VC6-x86.zip
提示:
- 建议选择无 SSL 功能的 Apache 版本来完成开发,我们这里使用了
httpd-2.2.21-win32-x86-no_ssl.msi
。 - 建议选择由 Apache 官方所提供的 mod_fcgid 作为 FastCGI 模块。我们这里使用目前最新版本 2.3.6。
- Windows 下安装 MySQL 就选择
.msi
安装包格式,我们选择了mysql-5.5.19-win32.msi
,双击根据向导安装即可,简单方便。 - PHP 我们选择用
php-5.3.5-nts-Win32-VC6-x86.zip
这个版本。这个是 nts(非线程安全)版本,是针对 PHP 的 FastCGI 安装方式。
第二步:安装文件
- 在要安装的磁盘建一个文件夹。为了以后管理方便我们在 D 盘的根目录下创建一个 WAMP 文件夹:
D:\WAMP
(WAMP 是 Windows + Apache + MySQL + PHP 的缩写)。 - 在 WAMP 文件夹下创建一个 WWW 文件夹,用来存放你的 PHP 网站程序:
D:\WAMP\WWW
。 - 安装 Apache 服务器,把 Apache 服务器安装到
D:\WAMP\Apache
文件夹。 - 把下载的
php-5.3.5-nts-Win32-VC6-x86
解压到D:\WAMP\PHP
文件夹。 - 安装 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-development
和 php.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 之间的关系
这个问题可以分两个层面讨论:
- PHP 解释器是否嵌入 Web 服务器进程内部执行
mod_php
通过嵌入 PHP 解释器到 Apache 进程中,只能与 Apache 配合使用。CGI
和FastCGI
以独立的进程形式出现,只要对应的 Web 服务器实现 CGI 或者 FastCGI 协议,就能够处理 PHP 请求。mod_php
这种嵌入的方式最大的弊端就是内存占用大,不论是否用到 PHP 解释器都会将其加载到内存中。
- 单个进程处理的请求数量
mod_php
和FastCGI
的模式在每个进程的生命周期内能够处理多个请求。CGI
的模式处理一个请求就马上销毁进程,在高并发的场景下性能非常糟糕。 综上,如果对性能有极高的要求,可以将静态请求和动态请求分开,这时 Nginx + php-fpm 是比较好的选择。 PS: CGI、FastCGI 通常指 Web 服务器与解释器通信的协议规范,而 php-fpm 是 FastCGI 协议的一个实现。
phpinfo 的 Server API 为 CGI/FastCGI 是什么模式
让 Web 服务器(如 IIS、Apache、Nginx 等)支持 PHP 的方式有两种:
- 通过模块加载的方式,适用于 Apache。
- 通过 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 是进程内的。