php生命周期

<?php


/*
* 1.php概述
* php快速灵活的脚本语言,支持面向程序和面向对象,语法混合了c java perl和php自己的一些语法,相比来说更加灵活 简洁 开发效率高 容易上手
* 开源免费 快捷灵活 效率高 类库资源丰富 扩展c/c++丰富 跨平台(zend虚拟机)
* 2. SPAI 概述
php内核提供语言编译和执行功能,标准输入、输出,SAPI就是php内核的接入层,是内核的入口。
SAPI 常用的有php-fpm cli cgi web模块 ISAPI五大模式,cli处理模式比较简单,php-fpm实现了网络处理模块的web交互部分
cli模式下,PHP提供的POSIX和Pcntl系列函数实现多进程的应用
子进程的优点:
1. 使用多进程, 子进程结束以后, 内核会负责回收资源
2. 使用多进程,子进程异常退出不会导致整个进程Thread退出. 父进程还有机会重建流程.
3. 一个常驻主进程, 只负责任务分发, 逻辑更清楚.
zend引擎
php语言的核心 编译执行的部分 编译器 + 执行器
扩展

* 3. php的执行流程
* 模块初始化 (注册常量EG(zend_constants) , 注册ini配置EG(ini_directives) , 注册全局变量CG(auto_globals) , 注册静态编译的核心扩展、ini配置饿扩展 , 扩展的初始化 )
* 请求初始化 (gc_reset计数器重置, 初始化编译器 , 初始化EG(function_table class_table auto_func symbol_table) , 初始化词法分析器 )
* 脚本执行阶段 (脚本加载,词法分析,语法分析编译成opcode,编译成语法抽象树op_array, zend_execute()调用zvm的指令去执行)
* 请求关闭 ( 依次调用注册的shutdown函数,清理EG(symbol_table)符号表,调用变量的析构函数, 清理文件句柄 socket连接等, 数据所有flush, 关闭output,关闭编译器执行器, 关闭内存管理)
* 模块关闭 ( 清理持久化符号表,清理扩展, 销毁EG ,释放PG))
*
* 4.FPM php的fastCGI进程管理器,fastCGI是web服务器和处理程序的通信协议
* fpm 创建一个master和多个worker进程,master通过共享内存来获取worker进程的信息,通过信号来发送控制信号去杀死一个worker
* fpm可以监听多个端口,每个端口可以创建一个worker pool ,每个pool下拥有多个worker。
* fpm的 conf文件
* [web1]
listen = 127.0.0.1:9000
...

[web2]
listen = 127.0.0.1:9001
...

* 查看fpm的进程 ps -aux|grep fpm 可以看到master和worker的状态
root 27155 0.0 0.1 144704 2720 ? Ss 15:16 0:00 php-fpm: master process (/usr/local/php7/etc/php-fpm.conf)
nobody 27156 0.0 0.1 144676 2416 ? S 15:16 0:00 php-fpm: pool web1
nobody 27157 0.0 0.1 144676 2416 ? S 15:16 0:00 php-fpm: pool web1
nobody 27159 0.0 0.1 144680 2376 ? S 15:16 0:00 php-fpm: pool web2
nobody 27160 0.0 0.1 144680 2376 ? S 15:16 0:00 php-fpm: pool web2

* fpm的进程管理方式有三种:static (master按照要求fork出配置要求的数量的worker进程,保存worker进程数不变)
* dynamic (master初始化一定数量的worker,运行期间发现worker空闲率比较低,继续fork进程去处理,不能超过配置最大进程数,空闲率比较高就杀死一些进程)
* ondemand 这种方式很少使用,不提前分配子进程,请求来了实时分配,处理完请求设置idle_timeout时间去退出worker
*

*
*/
posted @ 2018-01-11 16:20  helloworldlee  阅读(1455)  评论(0编辑  收藏  举报