Php是一门后端脚本语言,与go语言不同,其自身不提供web功能,要实现web应用,需要借助web服务器。由此引出cgi的概念
先看看什么是cgi(Common Gateway Interface):
早期的web服务器只处理html等静态文件,但像php等动态语言出现后,webserver处理不了了,就交给php解析器处理。但php解释器如何与web服务器通信呢?Cgi协议的出现,就是为了解决不同语言解释器(如php,python)与web服务器的通信。
简单的说,cgi是用来和web服务器打交道的,web服务器收到用户请求,就会把请求提交给cgi程序,cgi程序(php-fpm,hhvm)根据请求提交的参数作相应处理(解析php),然后将输出返回给web服务器,再返回给客户端。
cgi的改进->fastcgi:
cgi有个弊端,每次web请求,都会重新fork一个cgi进程,结束再kill掉,资源消耗大,不适合高并发。
于是fastcig就应运而生了。它事先早已启动好,一直运行等待web请求过来,再交给php解析,并将结果返回web服务器,继续等待下一个请求。
php-fpm和hhvm都是fastCGI协议的一种实现
php-Fastcgi Process Manage,是php的fastCGI实现,并提供了进程管理的功能。进程包含 master 进程和 worker 进程两种进程。master 进程只有一个,负责监听端口,接收来自 Web Server 的请求,而 worker 进程则一般有多个(具体数量根据实际需要配置),每个进程内部都嵌入了一个 PHP 解释器,是 PHP 代码真正执行的地方。
是Facebook开源的PHP执行引擎,可支持cli,fastcgi server(相当于php-fpm),http server(相当于nginx+phpfpm)三种运行方式。它将php转换为c++,再编译为二进制文件运行,所以性能更好。
相比php5.2,hhvm性能更高,更省cpu,据说能省40%-60%
但php7出来后,据说可以替代hhvm