本人曾经做过测试,使用cgi方式运行php效率最差,mod_php方式性能非常不错,几乎是cgi方 式的50倍,但是无法保证虚拟主机站点的安全性隔离,而fastcgi性能则基本和mod_php相当,这还是在使用了suexec切换虚拟主机站点运行 用户的情况下的结果。
Liunx 下php有三种运行模式
APACHE2HANDLER 效率最高,apache支持多线程,所以用线程安全php
CGI
fastcgi
php在apache中一共有三种工作方式:
CGI模式、FastCGI模式、Apache 模块DLL)
linux/unix下的好的2个模块分别为prefork和worker。
最初设计unix的时候,并没有线程这个概念,所以无论系统内核还是应用软件,都不支持线程的应用。最小的作业单位是进程。
windows是一个完全支持线程的操作系统。线程比进程更小,能提高系统效率,减少系统开支。
现在无论是linux还是freebsd,都在积极改进,在内核中加入线程的支持。
apache本身即支持线程也支持进程。它怎么实现的呢?就是用MPM。
prefork模块:基于进程的web服务器
worker模块:基于线程程的web服务器
Apache的三种工作模式
它一共有三种稳定的MPM(Multi-Processing Module,多进程处理模块)。它们分别是 prefork、worker 和 event 。
php-fpm FastCGI Process Manager
isapi模式:isapi是微软提供的一套标准,php的isapi模式意思是php在windows系统上的iis进行配合的运行模式,在php5.3之后不再支持,php5isapi.dll文件,php进程和iis进程合一块
apache2handler模式:php作为apache的模块,php进程和apache进程合一块
cgi模式:cgi一般是可执行程序,例如exe文件,每次都fork一个进程来运行外部的exe文件,并且只能处理一个用户请求,处理完成就会退出.当用户请求数量非常多时,会频繁的fork进程和退出进程,占用大量系统的资源效能低下.每次fork php进程独立运行处理.
fastcgi模式:在web服务器启动时候,fastcgi处理进程就开启而且不会退出.接收到请求后,服务器通过tcp或者本地socket直接把内容传递给fastcgi进程,常驻内存不需要每次都fork进程
ISAPI模式:ISAPI是微软提供的一套标准,PHP的ISAPI模式意思是PHP在windows系统上的IIS进行配合的运行模式,在PHP5.3之后不再支持,php5isapi.dll文件,PHP进程和IIS进程合一块
APACHE2HANDLER模式:PHP作为Apache的模块,PHP进程和Apache进程合一块
CGI模式:CGI一般是可执行程序,例如exe文件,每次都fork一个进程来运行外部的exe文件,并且只能处理一个用户请求,处理完成就会退出.当用户请求数量非常多时,会频繁的fork进程和退出进程,占用大量系统的资源效能低下.每次fork PHP进程独立运行处理.
FastCGI模式:在web服务器启动时候,FastCGI处理进程就开启而且不会退出.接收到请求后,服务器通过TCP或者本地socket直接把内容传递给FastCGI进程,常驻内存不需要每次都fork进程


PHP的常用运行方式:CGI、FastCGI、APACHE2HANDLER。
1、CGI
CGI即通用网关接口(common gatewag interface),它是一段程序,通俗的讲CGI就象是一座桥,把网页和WEB服务器中的执行程序连接起来,它把HTML接收的指令传递给服务器的执 行程序,再把服务器执行程序的结果返还给HTML页。CGI 的跨平台性能极佳,几乎可以在任何操作系统上实现。
CGI方式在遇到连接请求(用户 请求)先要创建cgi的子进程,激活一个CGI进程,然后处理请求,处理完后结束这个子进程。这就是fork-and-execute模式。所以用cgi 方式的服务器有多少连接请求就会有多少cgi子进程,子进程反复加载是cgi性能低下的主要原因。都会当用户请求数量非常多时,会大量挤占系统的资源如内 存,CPU时间等,造成效能低下。
2、FastCGI
fast-cgi 是cgi的升级版本,FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一 次。PHP使用PHP-FPM(FastCGI Process Manager),全称PHP FastCGI进程管理器进行管理。
Web Server启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module)。FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可见多个php-cgi)并等待来自Web Server的连接。
当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。
FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web Server中)的下一个连接。 在CGI模式中,php-cgi在此便退出了。
在上述情况中,你可以想象CGI通常有多慢。每一个Web 请求PHP都必须重新解析php.ini、重新载入全部扩展并重初始化全部数据结构。使用FastCGI,所有这些都只在进程启动时发生一次。一个额外的 好处是,持续数据库连接(Persistent database connection)可以工作。
3、APACHE2HANDLER
PHP作为Apache模块,Apache服务器在系统启动后,预先生成多个进程副本驻留在内存中,一旦有请求出 现,就立即使用这些空余的子进程进行处理,这样就不存在生成子进程造成的延迟了。这些服务器副本在处理完一次HTTP请求之后并不立即退出,而是停留在计算机中等待下次请求。对于客户浏览器的请求反应更快,性能较高。
什么是 SAPI?
SAPI 即 Server API, Server Application Programming Interface。
用于 Apache 2 的模块,当安装的是 PHP 5 的时候,编译出来的文件名是 libphp5.so;当安装的是 PHP 7 的时候,编译出来的文件名是 libphp7.so。
libphp5.so 或 libphp7.so 通常被安装在 Apache 的安装目录下的 modules 目录。
编译的时候需指定参数 with-apxs2=FILE,比如 with-apxs2=/usr/local/apache/bin/apxs
CGI,意为 Common Gateway Interface。
通常编译安装在 PHP 安装目录 bin 下,这个可执行文件名是 php-cgi。
CLI,意为 Command Line。命令行模式。
通常编译安装在 PHP 安装目录 bin 下,这个可执行文件名是 php。
输入 php -h 显示其用法。
默认不编译安装,除非指定编译参数 enable-embed
该模块允许在 C/C++ 语言中调用 PHP 提供的函数。
FastCGI Process Manager,也就是 FPM,PHP FastCGI 进程的管理器。
用于 LiteSpeed 的模块,默认不编译。
通过指定编译参数 with-litespeed 安装。 Build PHP as litespeed module
从 PHP 5.6 开始,引入了 phpdbg,交互式调试器,用于 Debug PHP 程序,可以在不用修改代码,不影响性能的情况下控制 PHP 的运行环境。
通常编译安装在 PHP 安装目录 bin 下,这个可执行文件名是 phpdbg。
PHP 5.4 和 5.5 也可以单独安装该模块。
