【PHP7内核剖析】——SAPI简析

前言:首先,从个人的角度来说一下关于SAPI这章吧!这章内容大多其实是讲了一些C语言的函数实现部分,之前若是没有C基础的同学,看起来可能会比较吃力,所以我的建议是,不用去通读里面的关键代码,首先我们对这些函数有一个影响,知道一个大概即可,后期有时间可以先了解一下C之后,再过来开这块,个人感觉会比较轻松!!!


先来说一下什么是SAPI?

SAPI是服务端应用层的接口,即PHP与其他应用交互的接口。要执行PHP脚本有很多种方式,例如通过Web服务器,或者直接在命令行下,也可以嵌入在其他程序中。

在PHP中SAPI常见的有四种,即cli,CGI,FPM,embed

1.cli:英文:command-line interface,翻译过来就是“命令行接口”。它在PHP中主要是用来方便直接运行php文件的,当你想做简单的调试的时候,这种方式无疑是最好的选择了。再来说一下cli内部的机制。首先cli是单进程模式,也就是说,cli请求完就关闭了。再来说他的生命周期,这个我在上篇文章中就说到了,没看的同学请移步传送门。那cli也是按照这个生命周期去执行的:                                                   

2.CGI:

CGI (Commom Gateway Interface),通用网关接口,它把网页和WEB服务器中的执行程序连接起来,把从HTML接收的指令传递给服务器的执行程序,再把服务器执行程序的结果返还给HTML页。CGI的跨平台性能极佳,几乎可以在任何操作系统上实现。CGI方式在遇到连接请求先要创建CGI的子进程,激活一个CGI进程,然后处理请求,处理完后结束这个子进程。这就是fork-and-execute模式。所以用cgi方式的服务器有多少连接请求就会有多少cgi子进程,子进程反复加载是CGI性能低下的主要原因。都会当用户请求数量非常多时,会大量挤占系统的资源如内存,CPU时间等,造成效能低下。

3.FPM:(FastCGI Process Manager),PHP FastCGI 进程管理器。说到FPM,就不得不先说一下fastCGI。首先来说,fastcgi本质是一个类似于http的协议,在PHP中它配合web一起实现http请求。FastCGI 是 CGI的升级版本,FastCGI可以看成是一个常驻型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一次。接着说FPM,FPM是怎么去管理进程的呢?首先在初始化的时候,它会生成一个master主进程与多个worker子进程。master主要用来管理worker进程,而worker进程则用来处理请求。master在管理worker的时候,会用3种不同的策略去管理:static(静态),dynamic(动态),ondemand(按需)。static是每次fork固定的子进程(pm.max_children起始php-fpm进程数量);dynamic是动态的去fork子进程(pm.start_servers:起始php-fpm进程数量pm.min_spare_servers:最小php-fpm进程数pm.max_spare_servers:最大php-fpm进程数量);ondemand就是你需要多少就fork多少子进程。值得注意的是,当子进程过多的时候,master也会去kill掉部分子进程,kill的策略是最长时间没有使用到的子进程,而且每个周期只能kill一个,若是空余子进程较多的话,也是一个周期kill一个子进程的!

4.embed:嵌入,主要是用来将PHP作为接口向第三方提供的。编译PHP时通过 --enable-embed=[shared|static]指定库类型,默认是共享库。

 

小结:cli主要用于命令行,fpm主要用于web端应用,emben主要用于第三方语言或者应用。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章