SAPI [Server Application Programming Interface 服务器端应用编程端口]

1
2
3
4
5
6
7
8
9
如果了解php体系结构,那么SAPI相信并不陌生,
它是提供了和外部通信的一致接口,
要实现这种通信就要去实现接口,
而实现了这些接口的实现大概分为:
1. cgi
2. fast-cgi
3. cli
4. apache 动态dll库
5. isapi

image

1. CGI [ 通用网关接口 / Common Gateway Interface ]

  • 理解

    1
    2
    3
    4
    5
    6
    7
    cgi 只是个抽象的协议,与进程与语言毛关系

    php的解析器php-cgi是一个具体的cgi程序,本身只做解析请求和返回结果,不参与php进程管理,比如每次都会解析加载php.ini文件和初始化执行环境

    php-cgi 是php自带的fastcgi管理器

    每次更新php.ini文件 需要重启php-cgi
  • Fork -And- Execute 模式

    1
    2
    3
    4
    当面对请求数量增加是,大量资源会被占用,
    因为每个请求对应一个cgi的子进程,每次都会解析加载文件,
    磁盘io,内存/cpu负载都会非常高,
    所以执行效率低

2. FastCGI [ 常驻型CGI / Long-Live CGI ]

  • 理解
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
        fastcgi 是个抽象的协议,与语言无关,可进一步理解为可伸缩的cgi开放扩展,是用来提高cgi性能的

    php-fpm实现了fastcgi协议,参与维护管理进程池

    php-fpm管理的对象是php-cgi,是php的fastcgi进程管理器

    php-fpm控制的是php-cgi的fastcgi进程

    php-fpm前身是php源代码的补丁,从5.3.2或更新版本中已经正式加入php源码,可以直接使用

    另外,php-fpm支持修改php.ini文件的平滑启动,新产生的work用新的配置,已经存在的old work 处理完就退休


    常驻型cgi,所以是cgi的升级版,之所以fast:

    它启动后以守护进程的方式后台运行,不会每次请求都fork,并且是c/s架构设计,把http服务和脚本解析服务(n>1个守护脚本解析进程)分开

image

3. CLI [ 命令行运行 / Command Line Interface ]

参考链接

  • 理解
1
2
3
4
5
不同于web服务运行环境,这是一种命令行模式

不仅可用作前台网页程序嵌套还能执行后端脚本应用

php cli模式支持使用多进程模式,常驻进程方式维护主进程

4. 模块模式 [ Apache等Web服务器运行的模式 mod_php5 ]

参考链接

  • 理解
    1
    2
    3
    4
    5
    6
    7
    模块模式 

    mod_php 作用是接收服务器传过来的php文件请求,处理请求并返回结果给服务器

    服务器(apache)可以动态的加载扩展引用 前提把拓展模块编译成动态链接库

    eg: LoadModule php5_module modules/mod_php5.so

5. ISAPI模式

  • 理解
    1
    2
    3
    4
    5
    6
    ISAPI(Internet Server Application Program Interface)是微软提供的一套面向Internet服务的API接口,
    一个ISAPI的DLL,可以在被用户请求激活后长驻内存,
    等待用户的另一个请求,还可以在一个DLL里设置多个用户请求处理函数,
    ISAPI的DLL应用程序和WWW服务器处于同一个进程中,
    由于win系的不兼容性,只能运行于windows环境,
    此外常驻进程模型使得处理请求性能高于cgi

PHP源码