php扩展与嵌入
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php扩展与嵌入相关的知识,希望对你有一定的参考价值。
1>.sapi(迷你版webserver)、minit(模块初始化)、rinit(扩展请求初始化方法)、rshutdown(请求终止)、mshutdown(模块终止)
一、生命周期:初始化myextension模块;在sapi启动后调用每个扩展的minit(模块初始化);然后php接着遍历所以的扩展,调用每个扩展的rinit(扩展请求初始化方法);请求处理完后,调用每个php扩展的rshutdown(请求终止)开始清理过程;最后当所以请求都满足,webserver或sapi开始准备终止,调用每个扩展的mshutdown(模块终止)方法,扩展最后一次卸载处理器和释放持久化分配的内存的机会
二、四种常见的sapi(webserver):cli/cgi,多进程模板,多线程模板,嵌入式
1>.cli(和cgi)生命周期过程:
$ php -f test.php ==> call each extension‘s minit(调用模块初始化方法) ==> request test.php(请求test.php) ==> call each extension‘s rinit(调用扩展初始化方法) ==> execute test.php(执行test.php) ==> call each extension‘s rshutdown(调用扩展的请求终止方法) ==> finish cleaning up after test.php(清理玩test.php) ==> call each extension‘s mshutdown(调用模块终止方法) ==> terminate php(终止php)
2>.多进程生命周期(下面是举例:一个子进程的形式)
minit cycle
{rinit cycle,script execution,rshutdown cycle}php page request
{rinit cycle,script execution,rshutdown cycle}php page request
。。。。。。
mshutdown cycle
这些子进程相互之间是独立的,这种模式不允许任意子进程知道其他子进程的数据,不过它允许其他子进程被替换,不影响其他子进程的稳定运行
3>.多线程生命周期(打开一个进程,里面包含多个线程在执行,降低了一些负载,避免了minit和mshutdown的重复调用,真正的全局数据只被分配和初始化一次)
minit (一个子进程里面的多个线程)
{rinit,script,rshutdown},{rinit,script,rshutdown},{rinit,script,rshutdown},{rinit,script,rshutdown},{rinit,script,rshutdown}
mshutdown
4>.嵌入式生命周期(特殊的地方可能把它当成一个整个请求的一部分被潜入到多个脚本片段中,多数情况下控制会在php和调用应用之间多次来回的传递)
模块初始化-》请求初始化-》请求-》请求终止-》模块终止
5>.Zend线程安全
tsrn(线程安全资源管理):单进程多线程webserver出现后,据需要一种对全局数据做新的处理的方法,最后这作为新的一层
线程安全数据池:在扩展的minit阶段,扩展调用ts_allocate_id()一次或者多次告诉tsrn层它锁需要的数据空间,tsrn接到通知后,会把总的运行空间增大到请求的字节数,并返回一个新的标识(获取的时候,扩 展从tsrn层请求当前的线程资源池,已ts_allocate_id()返回的id作为偏移量)
对于非线程环境时,这种去tsrn层请求当前线程资源池获取偏移量的方式效率比较慢一些,所以在进程的全局空间定义一个结构体,也就是说SAMPLE_G(sampleint) = 5;展开后就是sample_globals.sampleint = 5; 简单,快速,高效
6>.
以上是关于php扩展与嵌入的主要内容,如果未能解决你的问题,请参考以下文章