首先提供书的地址:http://www.walu.cc/phpbook/index.md,并向作者表示感谢!同时欢迎同看此书的人加入QQ群:76761320
本章知识点:
一、SAPI就是PHP和外部环境的代理器, 他把外部环境抽象后, 为内部的PHP提供一套固定的, 统一的接口,
使得PHP自身实现可以不用考虑不同的外部环境而导致逻辑复杂.
二、php终止与启动的两个概念:
1.PHP作为Apache(拿它举例,板砖勿扔)的一个模块的启动与终止,这次启动php会初始化一些必要数据。并且这些数据是常驻内存的!
2.当Apache分配一个页面请求过来的时候,PHP会有一次启动与终止,这也是我们最常讨论的一种。
3.通过修改扩展文件中的.c文件来体验,php的启动和终止
如果你的扩展起名为walu那么我们需要修改你扩展目录下的walu.c ,用下面代码中的函数替换walu.c中同名的函数
//这些代码都在walu.c里面,不再.h里 int time_of_minit;//在MINIT中初始化,在每次页面请求中输出,看看是否变化 PHP_MINIT_FUNCTION(walu) { time_of_minit=time(NULL);//我们在MINIT启动中对他初始化 return SUCCESS; } int time_of_rinit;//在RINIT里初始化,看看每次页面请求的时候变不。 PHP_RINIT_FUNCTION(walu) { time_of_rinit=time(NULL); return SUCCESS; } PHP_RSHUTDOWN_FUNCTION(walu) { FILE *fp=fopen("/cnan/www/erzha/time_rshutdown.txt","a+");//请确保文件可写,否则apache会莫名崩溃 fprintf(fp,"%d\n",time(NULL));//让我们看看是不是每次请求结束都会在这个文件里追加数据 fclose(fp); return SUCCESS; } PHP_MSHUTDOWN_FUNCTION(walu) { FILE *fp=fopen("/cnan/www/erzha/time_mshutdown.txt","a+");//请确保文件可写,否则apache会莫名崩溃 fprintf(fp,"%d\n",time(NULL)); return SUCCESS; } //我们在页面里输出time_of_minit和time_of_rinit的值 PHP_FUNCTION(walu_test) { php_printf("%d<br />",time_of_minit); php_printf("%d<br />",time_of_rinit); return; }
首先:PHP_MINIT_FUNCTION:
当模块被Zend Engine(ZE)加载后,例如Apache启动,加载了PHP模块,ZE会对每一个扩展模块调用此函数(如果有的话),可以在该函数里进行一些初始化操作。
PHP_RINIT_FUNCTION:
对于每一个"使用"该模块的PHP脚本请求前,都执行该函数(如果有的话),最好的例子: Session 扩展模块,如果在一个PHP脚本里执行session.start(), Session模块的PHP_RINIT_FUNCTION(),将被调用. 详情可以看看 session模块 的源代码
PHP_RSHUTDOWN_FUNCTION:
与PHP_RINIT_FUNCTION()相反,该函数是在一个 PHP 脚本执行完毕后执行
PHP_MSHUTDOWN_FUNCTION:
当ZE收到shutdown信号后,例如apache卸载PHP模块,ZE 对每一个模块调用此函数,最后关闭自己的核心子系统.
三、PHP的生命周期:
通过二的php的启动与终止我们了解到php执行了四个过程:
Module init、Request init、Request Shutdown、Module shutdown 。
四、线程安全:
看完之后感觉有些深,有些散乱,没明白到底讲的什么。等过段时间再来看!
推荐两篇关于线程安全的博文:
1.PHP源码分析之线程安全模型
2.深入研究PHP及Zend Engine的线程安全模型