PHP底层探索(一):几种常见的SAPI

来源:互联网 发布:知乎三国演义智慧 编辑:程序博客网 时间:2024/05/19 08:41

SAPI: Server Application Programming Interface 服务器端应用编程端口.即php与其他应用交互的接口.

常用的SAPI有:cgi fast-cgi cli apache的DLL

CGI
CGI即通用网关接口(Common Gateway Interface),他是一段程序,通俗的讲CGI就像是一座桥,把网页和web服务器中的执行程序连接起来,CGI把html接收的指令传给服务器执行程序,再把服务器处理的结果返回 给html页面.
CGI方式在发现用户的连接请求时,先创建CGI进程,并使用,然后进行处理,处理完成后结束该子进程.(fork-and-execute),所以使用CGI方式的服务器有多少请求就会创建多少子进程,子进程反复加载是CGI系能低的主要原因.当用户请求非常多时,会占用大量的系统资源.

Fast-CGI
更像是CGI的升级版本,FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行者,只要激活后,不会每次都花时间fork一次.php使用php-fpm(FastCGI Process Manager) 全称PHP FastCGI进程管理器进行管理.
fastcgi的工作原理
Web Server启动时挂载php-fpm并初始化,启动多个FastCGI解释器进程,并等待Web Server的连接.
当连接到Web Server时,php-fpm选择并连接到一个CGI解释器,Web Server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi.子进程完成处理后,将标准输出和错误信息,返回给Web Server . 当子进程关闭链接是,请求便算是完成. 子进程接着等待并处理来自php-fpm的下一个连接.在CGI模式中,子进程便在这结束了.
在上述过程中,可以想到CGI有多慢,每一个请求php都必须解析php.ini 重新载入全部扩展,并重新初始化全部数据结构,使用FastCGI,所有这些只会在启动时载入一次,并且,持续数据库连接*(Persistent database connection)* 可以工作.

APACHE2HANDLER
php作为apache模块,apache服务器在系统启动后,会预先创建多个进程副本驻留内存,等待连接出现,一旦有请求,就立即使用空闲的子进程进行处理,这样就不存在生成子进程时的延迟.这些服务器副本在处理完成后,不退出,而是继续等待请求出现,反应更快,性能更高.

CLI

1.完全支持多线程
2.可实现定时任务
3.linux下可用php编写shell脚本
(经常用的东西,还不知道有这么多参数..)
使用PHP CLI传递脚本参数的形式:
-a 交互式运行Run interactively
-c path 从path读取php的.ini文件
-n 不用读取php的.ini文件就直接运行
-m 列出经过编译的模块
-i 显示有关PHP构建的信息
-l 检查PHP脚本的句法
-s 以彩色方式显示源代码
-w 显示去掉注释之后的源代码
-h 显示帮助

至此,我对SAPI有了一定的认识
想了解更多,可以看官方手册:http://php.net/manual/zh/features.commandline.php

0 0
原创粉丝点击