SAPI,是 Server Application Programming Interface 的首字母缩写,意思是服务器端应用编程接口。

这是 PHP 内核提供给外部调用其服务的接口,即外部系统可以通过 SAPI 来调用 PHP 提供的编译脚本、执行脚本的服务。

PHP中常用的SAPI有cli、php-fpm,cli是命令行下执行PHP脚本的实现:bin/php script.php,它是单进程的,处理模型比较简单,而php-fpm相对比较复杂,它实现了网络处理模块,用于与web服务器交互。

从下图可以较为清晰的理解外部系统是如何通过 SAPI 调用 PHP 服务的

Zend引擎

Zend是PHP语言实现的最为重要的部分,是PHP最基础、最核心的部分,它的源码在/Zend目录下,PHP代码从编译到执行都是由Zend完成的,后面章节绝大部分的源码分析都是针对Zend的。Zend整体由两个部分组成:

  • 编译器: 负责将PHP代码编译为抽象语法树,然后进一步编译为可执行的opcodes,这个过程相当于GCC的工作,编译器是一个语言实现的基础
  • 执行器: 负责执行编译器输出的opcodes,也就是执行PHP脚本中编写的代码逻辑

 

接下来主要是讨论下我们常见的 Cli、和 Fpm 是如何工作的。

Cli

Cli(Command Line Interface),即命令行接口,用于在命令行下执行 PHP 脚本,就像 Shell 那样,它是执行 PHP 脚本最简便的一种方式。

Cli 是单进程模式,处理完请求后就直接关闭了,生命周期先后经历 module startuprequest startupexecute scriptrequest shutdownmodule shutdown,其执行流程比较简单,关键的处理过程如下:

main()-> php_cli_startup()-> do_cli()-> php_module_shutdown()
Fpm

Fpm(FastCGI Process Manager)是 PHP FastCGI 运行模式的一个进程管理器,从它的定义可以看出,Fpm的核心功能是进程管理。

FastCGI 是 Web 服务器(如Nginx、Apache)和处理程序之间的一种通信协议,它是与HTTP类似的一种应用层通信协议。
注意:它只是一种协议!

Fpm 是一种多进程模型,它由一个 master 进程和多个 worker 进程组成。master 进程启动时会创建一个 socket,但是不会接收、处理请求,而是由 fork 出的 worker 子进程完成请求的接收及处理。即 master 进程管理 worker 进程,而 worker 进程才是真正的处理请求。

Fpm 在启动后首先会进行 SAPI 的注册操作;接着会进入 PHP 生命周期的 module startup 阶段,在这个阶段会调用各个扩展定义的 MINT 钩子函数。然后会进行一系列的初始化操作,最后 master、worker 进程进入不同的处理环节。

worder 进程的生命周期如下图:


其生命周期主要经历这几个阶段:等待请求、解析请求、请求初始化、执行 PHP 脚本、关闭请求。

master 进程主要通过三种不同的方式来管理 worder 进程,分别是静态模式(static)、动态模式(dynamic)、按需模式(ondemand)。具体要使用哪种模式可以在conf配置中通过pm指定。

  • static: 这种方式比较简单,在启动时master按照pm.max_children配置fork出相应数量的worker进程,即worker进程数是固定不变的
  • dynamic: 动态进程管理,首先在fpm启动时按照pm.start_servers初始化一定数量的worker,运行期间如果master发现空闲worker数低于pm.min_spare_servers配置数(表示请求比较多,worker处理不过来了)则会fork worker进程,但总的worker数不能超过pm.max_children,如果master发现空闲worker数超过了pm.max_spare_servers(表示闲着的worker太多了)则会杀掉一些worker,避免占用过多资源,master通过这4个值来控制worker数
  • ondemand: 这种方式一般很少用,在启动时不分配worker进程,等到有请求了后再通知master进程fork worker进程,总的worker数不超过pm.max_children,处理完成后worker进程不会立即退出,当空闲时间超过pm.process_idle_timeout后再退出

线程安全

在C语言中声明在任何函数之外的变量为全局变量,全局变量为各线程共享,不同的线程引用同一地址空间,如果一个线程修改了全局变量就会影响所有的线程。所以线程安全是指多线程环境下如何安全的获取公共资源。

PHP的SAPI多数是单线程环境,比如cli、fpm、cgi,每个进程只启动一个主线程,这种模式下是不存在线程安全问题的,但是也有多线程的环境,比如Apache,或用户自己嵌入PHP实现的环境,这种情况下就需要考虑线程安全的问题了,因为PHP中有很多全局变量,比如最常见的:EG、CG,如果多个线程共享同一个变量将会冲突,所以PHP为多线程的应用模型提供了一个安全机制:Zend线程安全(Zend Thread Safe, ZTS)。

转载于:https://www.cnblogs.com/cshaptx4869/p/10820485.html

PHP 的 SAPI 是个什么东西(转)相关推荐

  1. 用SAPI做一个聊天模拟器

    一.目前掌握的关于SAPI的情报 1.可以通过笔记本电脑的听筒和话筒,实现语音识别,语音朗读. 2.可以识别出预先设定的中文内容. 3.可以朗读输入的中文内容. 最初的想法是为工业控制软件添加语音识别 ...

  2. 基于SAPI(微软的语音API)的文字转语音功能

    一.环境配置 1.下载Microsoft Speech SDK 5.1,下载地址为:http://www.microsoft.com/download/en/details.aspx?id=10121 ...

  3. C#调用SAPI实现语音合成的两种方法

    [size=medium] 我们都知道现在的语音合成TTS是可以通过微软的SAPI实现的,好处我就不多说了,方便而已,因为在微软的操作系统里面就自带了这个玩意,主要的方式有两种: [color=red ...

  4. 关于php线程安全的一些东西

    本篇文字转自:http://blog.codinglabs.org/articles/zend-thread-safety.html 在阅读PHP源码和学习PHP扩展开发的过程中,我接触到大量含有&q ...

  5. php发布商品信息逻辑,php – 逻辑思考一个数据库结构:为用户发布的东西添加“标签” – 一个单独的表或……?...

    我仍然开始关注整个关系数据库 – thingymawhatsit.无论如何,我是一个PHP程序员,所以我可以做所有那些shabang.我只需要考虑这个场景的最佳方法是什么-- 我正在开发一个网站(如果 ...

  6. 进制转换 位运算(包括补码、原码、反码、~0等一些零碎东西一次说清)

    我发现网上关于标题上的内容介绍的都很零碎,因此为了方便查找.也为了本人对这一部分的充分理解,就想着写一篇这样的博客(我分成了几个部分,以便查找): 一.进制转换 让我们先来看看各个进制的定义: 十进制 ...

  7. Delphi XE2 发布了,期待了很久的东西,开始学习中。

    这个博客将记录我学习DELPHI XE2及开发相关应用程序的点点滴滴,因此该博客内容全部原创,我也不会转载和抄录别人的代码.为了让大家和我一同进步,所有示例都带源代码,你可以随时下载后进行调试运行. ...

  8. SharePoint2010是个什么东西

    Microsoft SharePoint Foundation is an application that is built on top of Internet Information Servi ...

  9. 我使用Python和Django在自己的网站上建立了一个会员专区。 这是我学到的东西。

    I decided it was time to upgrade my personal website in order to allow visitors to buy and access my ...

最新文章

  1. kvm虚拟机--存储池配置梳理(转)
  2. python Intel Realsense D435 图像自动采集程序 自动剔除模糊图像
  3. Fragment使用LocalBroadcastManager接收广播消息
  4. 2.Cocos2dx 3.2中的重力系统Box2D
  5. 如何从svn上down项目
  6. 光伏等新能源信用风险事件频繁爆发
  7. mysql long varchar2_案例:Oracle数据库long查询结果转换为varchar2类型方法的操作步骤...
  8. 关于在项目中使用开源项目的疑惑,恳请大家给点意见!
  9. python刚出来多少薪资-2019 年Python工程师的平均薪资是多少?
  10. RDLC报表速成指南
  11. 有用的linux命令笔记
  12. CentOS6 图形界面(gnome)安装(转)
  13. 系统分析与设计期末复习题目
  14. 班主任工作总结中职计算机网络,中职班主任工作总结(精选5篇)
  15. flash 旋转效果
  16. Wireshark抓取ping包
  17. 【程序人生】这是 2017 关于程序员薪酬最详尽的调查报告
  18. 定时任务实现的几种方式
  19. 算法之大数运算加减法源代码
  20. office2016下安装Mathtype之后显示DLL找不到的问题

热门文章

  1. 利用apktool查看apk源代码
  2. 使用JDT ASTParser解析Java语句序列
  3. 前端踩坑(八)前端使用Moment 时间格式化错误
  4. 管理者的50堂课之创始人篇 读书笔记
  5. Android 10.0 Launcher3双层(抽屉)高斯模糊(毛玻璃)背景功能的实现
  6. HTTP详解(更新完结)
  7. 【转载】知行合一在年轻人中的作用
  8. web项目上云_联想Filez—携手浙江中烟,发力“云”端,打造“烟草上云”新势能...
  9. 机器学习理论 之 经验风险最小化(Empirical Risk Minimization)
  10. 奔跑吧DKY——团队Scrum冲刺阶段-Day 4