php源码03 – php运行的生命周期

php源码03 – php运行的生命周期概述这是源码 php7 系列的第三篇文章 主要介绍 PHP 运行的生命周期 FastCGI Fpm 和 Nginx 的调用 彻底学透底层知识是解决问题的根本 php7 编译安转 新特性基本变量与内存管理机制 CLI 模式下的生命周期 CLI 模式小生命周期 模块初始化阶段 gt 请求初始化阶段 gt 脚本执行阶段 gt 请求关闭阶段 gt 模块关闭阶段 1 php 初始化部分函数调用 1 对 sapi globals 中的成员变量做初始化 sapi initialize empty request 2 调用 s

概述

这是源码php7系列的第三篇文章,主要介绍PHP运行的生命周期、FastCGI、Fpm和Nginx的调用,彻底学透底层知识是解决问题的根本。

  • php7编译安转、新特性
  • 基本变量与内存管理机制

CLI模式下的生命周期

CLI模式小生命周期:模块初始化阶段->请求初始化阶段->脚本执行阶段->请求关闭阶段->模块关闭阶段

在这里插入图片描述

1.php初始化部分函数调用

  • 1.对sapi_globals中的成员变量做初始化(sapi_initialize_empty_request)
  • 2.调用sapi_module里面的active方法(sapi_activate)
  • 3.初始化output相关变量(php_output_startup)
  • 4.对tick_function进行初始化(php_startup_ticks)
  • 5.对gc_globals_ctor进行初始化(gc_globals_ctor)
  • 6.初始化内存管理,初始化cwd_globals,启动扩展机制,设置一些工具函数,设置词法和语法函数,初始化zend虚拟机的handler,已经对全局变量的初始化等(zend_startup)
  • 7.注册析构list(zend_register_list_destructors_ex)
  • 8.计算php执行的二进制程序的路径(php_binary_init)
  • 9.初始化输出相关的预定义常量(php_output_register_constants)
  • 10.注册文件上传相关的预定义常量(php_rfc1867_register_constants)
  • 11.初始化配置信息,同时调用zend_parse_ini_file解析php.ini里面的配置(php_init_config)
  • 12.注册zend_ini_entries(zend_register_ini_entries)
  • 13.注册GET/POST/COOKIE/SERVER/ENV/REQUEST/FILE自动的全局变量(php_startup_auto_globals)
  • 14.设置utility values(zend_set_utility_values)
  • 15.初始化SAPI对于不同类型内容的处理函数(php_startup_sapi_content_types)
  • 16.注册内部扩展(php_register_internal_extensions)
  • 17.启动附加的php扩展(php_register_extensions_bc)
  • 18.加载所有外部扩展(php_ini_register_extensions)
  • 19.对模块进行排序,并检测是否注册到module_register HASH表里
  • 20.来启动各个模块(zend_startup_extensions)
  • 21.注册附件的函数(zend_register_function)
  • 22.禁用php.ini配置要禁用的函数和类

2.详解php_request_startup阶段

php_request_startup是请求级别的操作,每请求一次就执行一次。

php_request_startup执行过程:

  • 1.重置输出全局并设置输出处理程序的堆栈(php_output_activate)
  • 2.重置垃圾回收(gc_reset)
  • 3.初始化编译器(init_compiler)
  • 4.初始化执行器(init_executor)
  • 5.初始化扫描器
  • 6.调用sapi_module里面的activate方法(sapi_activate)
  • 7.对信号进行处理
  • 8.设置超时时间(zend_set_timeout)
  • 9.初始化相关全局变量
  • 10.调用request_startup_func激活模块

3.详解执行和管理阶段

执行和管理阶段是PHP生命周期最核心的地方,但是它并不复杂,执行步骤如下:

  • 1.complie_file
  • 2.读取PHP代码内容,并将词法分析指针指向第一个位置
  • 3.通过词法和语法分析生成AST(抽象语法树),赋值到CG(ast)
  • 4.初始化op_array
  • 5.将AST转化为op_array
  • 6.设置op_array中对应Zend虚拟机的handler
  • 7.在Zend虚拟机中执行op_array

FPM的三种模式

在讨论FPM模式之前先了解一下,相关知识点:

查看配置文件,安装目录/etc/php-fpm.conf.default 这里,看include的值

include=/usr/local/php7.1.0/etc/php-fpm.d/*.conf 

静态模式

fpm的静态模式只要设置2个参数,启动8个work进程等待客户端的请求。

pm = static // 设置静态模式 pm.max_children = 8 //设置work进程数 

找到配置文件etc/php-fpm.d/www.conf,中的pm、pm.max_children的值,启动fpm服务:

/usr/local/php7.1.0/sbin/php-fpm -c etc/php-fpm.conf 

查看进程,停止服务用kill PID(进程号)

[root@dd2065d03db8 php7.1.0]# ps aux | grep fpm root 67 0.0 0.3 47072 6828 ? Ss 08:18 0:00 php-fpm: master process (/usr/local/php7.1.0/etc/php-fpm.conf) nobody 68 0.0 0.2 47072 5904 ? S 08:18 0:00 php-fpm: pool www nobody 69 0.0 0.2 47072 5904 ? S 08:18 0:00 php-fpm: pool www nobody 70 0.0 0.2 47072 5904 ? S 08:18 0:00 php-fpm: pool www nobody 71 0.0 0.2 47072 5904 ? S 08:18 0:00 php-fpm: pool www nobody 72 0.0 0.2 47072 5908 ? S 08:18 0:00 php-fpm: pool www nobody 73 0.0 0.2 47072 5908 ? S 08:18 0:00 php-fpm: pool www nobody 74 0.0 0.2 47072 5892 ? S 08:18 0:00 php-fpm: pool www nobody 75 0.0 0.2 47072 5908 ? S 08:18 0:00 php-fpm: pool www root 77 0.0 0.0 9104 908 pts/1 S+ 08:18 0:00 grep --color=auto fpm 

动态模式

fpm的动态模式启动时work个数取决于pm.start_servers参数,当请求量变大时迅速增长,最大work数等于 pm.max_children + pm.start_servers

pm = dynamic pm.max_children = 20 pm.start_servers = 2 

fpm的生命周期

在这里插入图片描述

如果直接kill PID掉php-fpm的master进程,服务会直接停止,如果执行的是kill -9 PID 是可以访问的,直到进程没有请求,被服务器回收停止,如果kill掉php-fpm的子进程,服务是会继续提供服务的,php-fpm是负责管理进程,不参与处理请求,work才是处理请求的进程。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/208569.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午11:16
下一篇 2026年3月19日 上午11:17


相关推荐

  • unity常用的800个脚本_unity怎么挂载脚本

    unity常用的800个脚本_unity怎么挂载脚本使用Flow类型的指令十分类似于使用英语口语,基本上这些指令的单词只要看到就能猜到它的作用,尤其是学过编程的朋友对其中的某些单词一定很熟悉。 1)Break:让一个循环强制终止。 2)Wait和WaitFreams:前者为等待若干秒(second),后者为等待若干帧(fream)。        3)Stop和StopBlock和S…

    2025年6月29日
    3
  • 聊一聊最近热门缺货的安森美 Python1300/300系列CMOS图像传感器型号互替问题

    聊一聊最近热门缺货的安森美 Python1300/300系列CMOS图像传感器型号互替问题作者 Hello Panda2021 年在电子产品领域最热的关键词可能是 缺货 涨价 和 替代料 从最初的车载芯片市场开始 到单片机 到电源芯片 然后是各种 PHY 接口 直至到 FPGA 等高端市场 这几个主题词一直贯彻到底 对于大多数的没有备货和必须从代理或市场拿货的中小型企业而言 无疑是一次地毯式的打击 大家有的选择各种渠道积极找料 有的选择寻找对应的替代方案 有的选择 躺平 等等 咱暂且不论这背后的故事 到底是真缺还是假缺 到底是被迫缺还是人为缺等等 简单的聊一下今天吹水的主题 几款热门的安森美

    2026年3月19日
    1
  • javaScript模块化解析「建议收藏」

    javaScript模块化解析「建议收藏」JavaScript模块化解析什么是模块化?到底什么是模块化、模块化开发呢?事实上模块化开发最终的目的是将程序划分成一个个小的结构;这个结构中编写属于自己的逻辑代码,有自己的作用域,不会影响到其他的结构;这个结构可以将自己希望暴露的变量、函数、对象等导出给其结构使用;也可以通过某种方式,导入另外结构中的变量、函数、对象等;上面说提到的结构,就是模块;按照这种结构划分开发程序的过程,就是模块化开发的过程;无论你多么喜欢JavaScript,以及它现在发展的有多好,它都有很多的缺陷:比如

    2025年6月6日
    4
  • SSM框架面试题之Spring

    SSM框架面试题之Spring1、Spring在ssm中起什么作用?Spring:轻量级框架作用:Bean工厂,用来管理Bean的生命周期和框架集成。两大核心:1、IOC/DI(控制反转/依赖注入):把dao依赖注入到service层,service层反转给action层,Spring顶层容器为BeanFactory。2、AOP:面向切面编程。2、Spring的事务?编程式事务管理:编程方式管理事务,极大灵活性,难…

    2022年6月18日
    26
  • jsplumb设置锚点_jsplumb

    jsplumb设置锚点_jsplumb一 简介 jsplumb 是 jquery 的一个插件 它能够让你用动态或静态的链接来连接 html 界面上的元素 并且从 1 10 版本开始 提供用鼠标拖动来连接 jsPlumb 允许您使用 SVG Canvas 或者 VML 链接屏幕上的元素 这些取决于您使用的浏览器的能力 主要包含以下模块 Anchor Connector Endpoint Overlay Style 二 Anchor StaticAnchor

    2026年3月26日
    2
  • AI Content Automation Platform · 开发日志 Day1

    AI Content Automation Platform · 开发日志 Day1

    2026年3月16日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号