sqlitePHP扩大-生命周期和内存管理

1. PHP源码结构

PHP的内核子系统有四个,ZE(Zend Engine)和PHP Core.
ZE负责将PHP脚本解析成机器码(也变为token符)后,在进度空间执行这么些机器码;ZE还负责内存管理,变量成效域管理和对PHP函数的调度管理。

PHP Core负责和SAPI层的通讯;PHP Core也为safe_mode,
open_basedir的检讨提供了联合控制层;PHP
Core还提供了streams层,用于用户域的文书和互连网IO操作。其中SAPI(Server
Application Programming
Interface)寻常包蕴Nginx,Apache,IIS,CLI,CGI等主机环境。

PHP扩充在ZE和PHP
Core的根基上提供对各样常用操作的包裹,比如对mysql,redis,memcache,sqlite等的读写,对json,xml文件的解析,对soap,sokcet,curl的互连网协议的卷入,对加密解密压缩解压缩等的包装,对图像处理的卷入等等。有些增添是从零早先完成某个意义,比如按照redis的通讯协议使用C来完毕和redis的通讯;有些扩大则是通过调用系统已有的库,比如图片处理的gb扩大要求系统本身要设置了相应的gd库。
在PHP源码php-5.6.24/ext中提供了78个增加。

总的说来,由ZE和PHP Core提供基础的架构,由EXT(增添)提供用户域的各样操作。
以php-5.6.24源码为例,ZE对应文件夹php-5.6.24/Zend, PHP
Core对应文件夹php-5.6.24/main, 伸张对应文件夹php-5.6.24/ext。

2. PHP增加的生命周期

PHP在收受到SAPI命令时,首先起始化并启动它的内核子系统,在内核子系统的起步快截止时,PHP最先加载它的增加代码并对增加开端化,此时PHP将调用每个模块的起首化例程Module
Initialization routine (MINIT)。

MINIT(Module Initialization)
PHP调用MINIT相关例程,使得各种增加有机遇初始化内部变量、分配资源、注册资源处理句柄,以及向ZE注册自己的函数,以便于脚本调用那里面的函数时候ZE知道执行怎么着代码

RINIT(Request Initialization)
在模块初叶化完毕后,PHP等待来自SAPI的央浼,当收到到SAPI请求后,由ZE为当前被呼吁的php脚本创制运行条件,并调用每个扩张的Request
Initialization(RINIT)函数,使得各类增加有时机设定一定的环境变量,依据请求分配资源,或者执行其余义务,如查处。

此处所说的SAPI请求分为两类,一类是Apache, IIS, 和别的成熟的web server
SAPIs,他们在启动时PHP先执行了MINIT,之后等待来自用户的页面请求,当接过请求后实施RINIT;另一类SAPI请求则是CGI
or CLI SAPIs,PHP在吸收那类SAPI请求时,执行完MINIT立即就执行RINIT。

当RINIT请求开首化完成后,ZE接回控制权并将最近被呼吁的剧本翻译成tokens,
最终构成opcodes(操作码),opcodes被实践进度中,若是某个opcode需求进行某个增加函数,那是ZE就会将相关参数绑定到改函数,并将控制权临时交给该函数去履行,直到该函数执行落成。

RSHUTDOWN(Request Shutdown)
PHP脚本运行截止后,PHP调用每个伸张的伸手关闭(RSHUTDOWN)函数以进行最终的清理工作(如将session变量存入磁盘)。接下来,ZE执行清理进度(垃圾收集),有效地对后面的请求时期利用的各类变量执行unset()。

MSHUTDOWN(Module Shutdown)
当RSHUTDOWN完毕后,PHP继续伺机SAPI的任何文档请求或者是倒闭信号。对于CGI和CLI等SAPI,没有“下一个伸手”,所以SAPI立时先河关闭。关闭时期,PHP再一次遍历每个增添,调用其模块关闭(MSHUTDOWN)函数,并最后关闭自己的内核子系统。

GINIT
开始化全局变量

GSHUTDOWN
自由全局变量

MINFO
设置phpinfo模块的新闻,phpinfo要等级每个扩充的安插信息

// main/php.h
 #define PHP_MINIT       ZEND_MODULE_STARTUP_N
 #define PHP_MSHUTDOWN   ZEND_MODULE_SHUTDOWN_N
 #define PHP_RINIT       ZEND_MODULE_ACTIVATE_N
 #define PHP_RSHUTDOWN   ZEND_MODULE_DEACTIVATE_N
 #define PHP_MINFO       ZEND_MODULE_INFO_N
 #define PHP_GINIT       ZEND_GINIT
 #define PHP_GSHUTDOWN   ZEND_GSHUTDOWN

 #define PHP_MINIT_FUNCTION      ZEND_MODULE_STARTUP_D
 #define PHP_MSHUTDOWN_FUNCTION  ZEND_MODULE_SHUTDOWN_D
 #define PHP_RINIT_FUNCTION      ZEND_MODULE_ACTIVATE_D
 #define PHP_RSHUTDOWN_FUNCTION  ZEND_MODULE_DEACTIVATE_D
 #define PHP_MINFO_FUNCTION      ZEND_MODULE_INFO_D
 #define PHP_GINIT_FUNCTION      ZEND_GINIT_FUNCTION
 #define PHP_GSHUTDOWN_FUNCTION  ZEND_GSHUTDOWN_FUNCTION

 

3. PHP伸张的内存管理

ZE在进行自己内部的内存管理时,通过附加的标志来标识某某内存变量是或不是是持久性的,对于非持久内存,ZE会去清理。但在扩充内部最好照旧友好去清理非持久内存,因为扩大自己请求分配的非持久内存,将在长日子内保持为未回收状态,那样与之皮之不存毛将焉附的资源长日子得不到释放。

 

参考小说:Extension Writing Part I: Introduction to PHP and
Zend

sqlite 1

网站地图xml地图