位置: 编程技术 - 正文

深入理解PHP内核(二)之SAPI探究(php的核心)

编辑:rootadmin

推荐整理分享深入理解PHP内核(二)之SAPI探究(php的核心),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:php内涵,深入理解php内核工具,深入理解php内核设计,深入理解php内核pdf,php内核剖析,深入理解php内核设计,深入理解php内核设计,深入理解php内核工具,内容如对您有帮助,希望把文章链接给更多的朋友!

在上篇文章给大家介绍了深入了解PHP内核(一),相信大家通过本文多多少少都学到些知识吧,关于php内核知识继续关注本篇文章。

SAPI是Server Application Programming Interface(服务器应用编程接口)的缩写。PHP通过SAPI提供了一组接口,供应用和PHP内核之间进行数据交互。

简单的讲,就像函数的输入和输出一样,我们通过Linux命令行执行一段PHP代码,本质是Linux的Shell通过PHP的SAPI传入一组参数,Zend引擎执行后,返回给shell,由shell显示出来的过程。同样的,通过Apache调用PHP,通过Web服务器给SAPI传入数据,Zend引擎执行后,返回给Apache,由Apache显示在页面上。

图1. PHP架构图

PHP提供很多种形式的接口,包括apache、apache2filter、apache2handler、caudium、cgi 、cgi-fcgi、cli、cli-server、continuity、embed、isapi、litespeed、milter、nsapi、phttpd pi3web、roxen、thttpd、tux和webjames。但是常用的只有5种形式,CLI/CGI(命令行)、Multiprocess(多进程)、Multithreaded(多线程)、FastCGI和Embedded(内嵌)。

PHP提供了一个函数查看当前SAPI接口类型:

PHP的运行和加载

无论使用哪种SAPI,在PHP执行脚本前后,都包含一系列事件:Module的Init(MINT)和Shutdown(MSHUTDOWN),Request 的Init(RINT)和Shutdown(RSHUTDOWN)。 第一阶段是PHP模块初始化阶段(MINT),可以初始化扩展内部变量、分配资源和注册资源处理器,在整个PHP实例生命周期内,该过程只执行一次。

什么是PHP模块?通过上面的PHP架构图,在PHP中可以使用get_loaded_extensions 函数来查看所有编译并加载的模块/扩展,相当于CLI模式下的php -m。

以PHP的Memcached扩展源代码为例:

第二阶段是请求初始化阶段(RINT),在模块初始化并激活后,会创建PHP运行环境,同时调用所有模块注册的RINT函数,调用每个扩展的请求初始化函数 ,设定特定的环境变量、分配资源或执行其他任务,如审核。

第三阶段,请求处理完成后,会调用PHP_RSHUTDOWN_FUNCTION进行回收,这是每个扩展的请求关闭函数,执行最后的清理工作。Zend引擎执行清理过程、垃圾收集、对之前的请求期间用到的每个变量执行unset。请求完成可能是执行到脚本完成,也可能是调用die()或exit()函数完成

第四阶段,当PHP生命周期结束时候,PHP_MSHUTDOWN_FUNCTION对模块进行回收处理,这是每个扩展的模块关闭函数,用于关闭自己的内核子系统。

常见的运行模式

常见的SAPI模式有五种:

CLI和CGI模式(单进程模式)多进程模式多线程模式FastCGI模式嵌入式

1. CLI/CGI模式

CLI和CGI都属于单进程模式,PHP的生命周期在一次请求中完成。也就是说每次执行PHP脚本,都会执行第二部分讲的四个INT和Shutdown事件。

图2. CGI/CLI生命周期

深入理解PHP内核(二)之SAPI探究(php的核心)

2. 多进程模式(Multiprocess)

多进程模式可以将PHP内置到Web Server中,PHP可以编译成Apache下的prefork MPM模式和APXS模块,当Apache启动后,会fork很多子进程,每个子进程拥有自己独立的进程地址空间。

图3. 多进程模式生命周期

在一个子进程中,PHP的生命周期是调用MINT启动后,执行多次请求(RINT/RSHUTDOWN),在Apache关闭或进程结束后,才会调用MSHUTDOWN进行回收阶段。

图4. 多进程的生命周期

多进程模型中,每个子进程都是独立运行,没有代码和数据共享,因此一个子进程终止退出和重新生成,不会影响其他子进程的稳定。

3. 多线程模式(Multithreaded)

Apache2的Worker MPM采用了多线程模型,在一个进程下创建多个线程,在同一个进程地址空间执行。

图5. 多线程生命周期

4. FastCGI模式

在我们用的Nginx+PHP-FPM用的就是FastCGI模式,Fastcgi是一种特殊的CGI模式,是一种常驻进程类型的CGI,运行后可以Fork多个进程,不用花费时间动态的Fork子进程,也不需要每次请求都调用MINT/MSHUTDOWN。PHP通过PHP-FPM来管理和调度FastCGI的进程池。Nginx和PHP-FPM通过本地的TCP Socket和Unix Socket 进行通信。

图6. FastCGI模式生命周期

PHP-FPM进程管理器自身初始化,启动多个CGI解释器进程等待来自Nginx的请求。当客户端请求达到PHP-FPM,管理器选择到一个CGI进程进行处理,Nginx将CGI环境变量和标准输入发送到一个PHP-CIG子进程。PHP-CGI子进程处理完成后,将标准输出和错误信息返回给Nginx,当PHP-CGI子进程关闭连接时,请求处理完成。PHP-CGI子进程等待着下一个连接。

可以想象CGI的系统开销有多大。每一个Web 请求PHP都必须重新解析php.ini、载入全部扩展并始化全部数据结构。使用FastCGI,所有这些都只在进程启动时发生一次。另外,对于数据库和Memcache的持续连接可以工作。

5. 内嵌模式(Embedded)

Embed SAPI是一种特殊的SAPI,允许在C/C++语言中调用PHP提供的函数。这种SAPI和CLI模式一样,按照Module Init => Request Init => Request => Request Shutdown => Module Shutdown的模式运行。

Embed SAPI可以调用PHP丰富的类库,也可以实现高级玩法,比如可以查看PHP的OPCODE(PHP执行的中间码,Zend引擎的指令,由PHP代码生成)。

详细请见: Server中。PHP常见的SAPI模式有五种,CGI/CLI模式、多进程模式、多线程模式、FastCGI模式和内嵌模式。

了解PHP的SAPI机制意义重大,帮助我们理解PHP的生命周期,并了解如何更好的通过C/C++为PHP编写扩展,并在生命周期中找到提高系统性能的方式。

如何使用PHP Embed SAPI实现Opcodes查看器 PHP提供了一个EmbedSAPI,也就是说,PHP容许你在C/C++语言中调用PHP/ZE提供的函数。本文就通过基于EmbedSAPI实现一个PHP的opcodes查看器。首先,下载PHP源码以

谈谈你对Zend SAPIs(Zend SAPI Internals)的理解 SAPI:ServerabstractionAPI,研究过PHP架构的同学应该知道这个东东的重要性,它提供了一个接口,使得PHP可以和其他应用进行交互数据。本文不会详细介绍每

深入php内核之php in array 先给大家介绍phpinarray函数基本知识热热身。定义和用法in_array()函数在数组中搜索给定的值。语法in_array(value,array,type)参数描述value必需。规定要在数组

标签: php的核心

本文链接地址:https://www.jiuchutong.com/biancheng/276038.html 转载请保留说明!

上一篇:深入理解PHP内核(一)(php8底层内核)

下一篇:如何使用PHP Embed SAPI实现Opcodes查看器(如何使用定向流量)

  • 外购无形资产的摊销额计入什么费用
  • 增值税进项税没那么多,申报表多填
  • 餐饮业购买的油类有哪些
  • 手续费和利息属于哪一科目
  • 通用机打发票能作废吗
  • 房地产企业购入用于建造商品房的土地使用权
  • 如何核销财政票据的发票
  • 货物发出未开票不确认收入
  • 劳务派遣用工的岗位只能在哪些工作岗位上实施
  • 缴纳土地增值税
  • 给员工交的重大医疗保险怎么做分录?
  • 职工旅游费计入什么科目
  • 集团内关联企业有哪些
  • 一般纳税人申请流程
  • 装修改造增值税税率
  • 股东入资印花税怎么计算
  • 电子银行承兑汇票有风险吗
  • 股票回购会计处理
  • 产业扶持周转金退回多久到账
  • 公司收到境外付款的人民币
  • 修叉车这个工作怎么样
  • linux 数字
  • win11任务栏图标删除
  • 残保金零申报但是逾期未报
  • 政府补助计量的基础是
  • win10我无法更改某些设置
  • 铁杆茉莉的养殖方法
  • PHP:spl_autoload_functions()的用法_spl函数
  • 意外保险费是什么意思
  • 增值税留抵退税账务处理
  • 公司没有营业额零报税的后果
  • 牙痛怎么办怎么治疗
  • 公司购买二手车需要什么手续
  • 如何做世界上最小的遥控飞机
  • linux系统设置屏幕常亮
  • chrome怎么用谷歌
  • mysql跨库join
  • 固定资产提前报废当月计提折旧吗
  • opencv项目开发实战
  • python去掉文本的指定符号
  • mysql存储引擎是什么意思
  • 怎么样去掉
  • 租赁公司一般都有什么税
  • 以前年度损益调整属于哪类科目
  • 其他应付款的会计编码
  • 资产减值损失属于什么科目
  • 公司刚成立没有员工需要申报个税吗
  • 期权费如何入账
  • 财务费用包含了利息费用吗
  • 税务局手续费返还什么时间到账
  • 账上存货太多实收怎么办
  • 冲减实收资本是什么意思
  • 如果我们交了房租,对方不给我们开发票
  • 企业在期间新购进的设备、器具
  • 少做收入第二年怎么算
  • 简易征收计算企业所得税怎么算
  • 买二手设备需要签合同吗
  • 境外所得抵免限额大于境外承担的所得税税额
  • 5000以下的固定资产一次性计入费用
  • 工业企业生产什么
  • mysql 5.7.11 winx64安装配置方法图文教程
  • u盘装win7系统步骤
  • 在window中
  • fedora怎么用
  • watchs2最新版本
  • win7开机出现两个系统选项
  • 笔记本自带的win8
  • linker command failed with exit code 1 (use -v to see invocation)
  • cocos2dx 3.3 helloworld 入门 学习与详解
  • unity做3d游戏
  • JQuery.validationEngine表单验证插件(推荐)
  • linux如何批量执行脚本
  • 日历查询的算法怎么写
  • python 断言详细讲解用法及其案例
  • javascript playground
  • js实现网页收藏的方法
  • 居民与非居民的区别国际金融
  • 武汉税务证怎么网上申请
  • 环保税新政策
  • 江西社保申报时间
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设