PHP 的 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 startup
、request startup
、execute script
、request shutdown
、module 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 是个什么东西(转)相关推荐
- 用SAPI做一个聊天模拟器
一.目前掌握的关于SAPI的情报 1.可以通过笔记本电脑的听筒和话筒,实现语音识别,语音朗读. 2.可以识别出预先设定的中文内容. 3.可以朗读输入的中文内容. 最初的想法是为工业控制软件添加语音识别 ...
- 基于SAPI(微软的语音API)的文字转语音功能
一.环境配置 1.下载Microsoft Speech SDK 5.1,下载地址为:http://www.microsoft.com/download/en/details.aspx?id=10121 ...
- C#调用SAPI实现语音合成的两种方法
[size=medium] 我们都知道现在的语音合成TTS是可以通过微软的SAPI实现的,好处我就不多说了,方便而已,因为在微软的操作系统里面就自带了这个玩意,主要的方式有两种: [color=red ...
- 关于php线程安全的一些东西
本篇文字转自:http://blog.codinglabs.org/articles/zend-thread-safety.html 在阅读PHP源码和学习PHP扩展开发的过程中,我接触到大量含有&q ...
- php发布商品信息逻辑,php – 逻辑思考一个数据库结构:为用户发布的东西添加“标签” – 一个单独的表或……?...
我仍然开始关注整个关系数据库 – thingymawhatsit.无论如何,我是一个PHP程序员,所以我可以做所有那些shabang.我只需要考虑这个场景的最佳方法是什么-- 我正在开发一个网站(如果 ...
- 进制转换 位运算(包括补码、原码、反码、~0等一些零碎东西一次说清)
我发现网上关于标题上的内容介绍的都很零碎,因此为了方便查找.也为了本人对这一部分的充分理解,就想着写一篇这样的博客(我分成了几个部分,以便查找): 一.进制转换 让我们先来看看各个进制的定义: 十进制 ...
- Delphi XE2 发布了,期待了很久的东西,开始学习中。
这个博客将记录我学习DELPHI XE2及开发相关应用程序的点点滴滴,因此该博客内容全部原创,我也不会转载和抄录别人的代码.为了让大家和我一同进步,所有示例都带源代码,你可以随时下载后进行调试运行. ...
- SharePoint2010是个什么东西
Microsoft SharePoint Foundation is an application that is built on top of Internet Information Servi ...
- 我使用Python和Django在自己的网站上建立了一个会员专区。 这是我学到的东西。
I decided it was time to upgrade my personal website in order to allow visitors to buy and access my ...
最新文章
- kvm虚拟机--存储池配置梳理(转)
- python Intel Realsense D435 图像自动采集程序 自动剔除模糊图像
- Fragment使用LocalBroadcastManager接收广播消息
- 2.Cocos2dx 3.2中的重力系统Box2D
- 如何从svn上down项目
- 光伏等新能源信用风险事件频繁爆发
- mysql long varchar2_案例:Oracle数据库long查询结果转换为varchar2类型方法的操作步骤...
- 关于在项目中使用开源项目的疑惑,恳请大家给点意见!
- python刚出来多少薪资-2019 年Python工程师的平均薪资是多少?
- RDLC报表速成指南
- 有用的linux命令笔记
- CentOS6 图形界面(gnome)安装(转)
- 系统分析与设计期末复习题目
- 班主任工作总结中职计算机网络,中职班主任工作总结(精选5篇)
- flash 旋转效果
- Wireshark抓取ping包
- 【程序人生】这是 2017 关于程序员薪酬最详尽的调查报告
- 定时任务实现的几种方式
- 算法之大数运算加减法源代码
- office2016下安装Mathtype之后显示DLL找不到的问题
热门文章
- 利用apktool查看apk源代码
- 使用JDT ASTParser解析Java语句序列
- 前端踩坑(八)前端使用Moment 时间格式化错误
- 管理者的50堂课之创始人篇 读书笔记
- Android 10.0 Launcher3双层(抽屉)高斯模糊(毛玻璃)背景功能的实现
- HTTP详解(更新完结)
- 【转载】知行合一在年轻人中的作用
- web项目上云_联想Filez—携手浙江中烟,发力“云”端,打造“烟草上云”新势能...
- 机器学习理论 之 经验风险最小化(Empirical Risk Minimization)
- 奔跑吧DKY——团队Scrum冲刺阶段-Day 4