张翠山的博客

cgi、fastcgi、php-cgi、php-fpm剖析

定义

cgi

  • 通用网关接口,外部程序与web服务器之间的接口标准,是在cgi程序和web服务器之间传递信息的过程

  • 每一次请求都会生成一个cgi进程,cgi程序执行完,进程退出

  • 独立于服务器、独立编程语言

FastCgi

  • FastCgi 像是一个常驻型的Cgi,它可以一直执行这,只要激活后,不需要每次去fork一次,还支持分布式运算,即FastCgi程序可以在网站服务器以外的主机上执行并且接受来自其他网站服务器的请求
  • 可以同时处理多个请求
  • 长期占用内存

php-cgi

  • php官方自带的FastCGI 进程管理器
  • php.ini修改之后,必须kill掉php-cgi再启动php.ini 才生效。不可以平滑的重启
  • 内存不能动态分配

php-fpm

  • 非官方fastCgi进程管理器,后来php5.4开始,被官方收录了,编译php的时候只需要–enable-fpm 就可以开启php-fpm
  • 可以平滑重启php
  • 动态调度进程

原理

cgi

以apache为例,首先要配置好cgi访问目录,访问 http://127.0.0.1/cgi-bin/printenv.pl
apache收到用户请求,开始调用cgi接口,处理cgi程序(printenv.pl),处理完了之后返回 cgi程序处理后的结果。
说一下我走过的一个坑,为了验证cgi程序,我特意编译了apache2.4 ,然后配置httpd.conf 但是访问cgi程序还是报错。主要原因就是。cgi文件,没有加上调用哪个程序执行 。 这样的语句, “#!/bin/sh” ,加上之后就可以正常的返回了

fastCgi

本来我想用apache 实现 fastcgi 有两种方式,一种是mod_fcgid 模块(官方模块),还有一种是mod_fastcgi 模块(外部模块),两种方式我都试着安装了一下,但是都没有安装成功。都打不开链接了
我的理解是,web服务器启动,自动启动fastCgi模块 并且长期驻留在内存里, 用户访问 fastCgi程序,开启的fastCgi模块 ,直接处理请求,并返回结果.

php-cgi

启动php,指定启动的worker ,长期驻留在内存里 ,用户访问php文件, php-cgi 处理请求,返回结果

php-fpm

启动php,动态指定启动的worker ,长期驻留在内存里 ,根据来访压力动态增减worker的进程数量,用户访问php文件, php-fpm 处理请求,返回结果

关系

  • cgi是最初始的网关接口,随着互联网的发展,大量的请求,衍生而来很多的问题,fastCgi开始出现了,取代了cgi技术
  • php是动态脚本语言 , php5.3以前 用php-cgi 来实现 fastCgi web请求,php 5.4开始,php-fpm 取代了php-cgi ,主要原因是 不能平滑重启php ,内存不能进行动态分配

总结

上面所说都是我总结的,出于我的理解,大家如果有质疑欢迎和我进行沟通

坚持原创技术分享,您的支持将鼓励我继续创作!