大家都知道PHP有很多运行模式,前面我也有一篇文章简单介绍了一下PHP常见的几种运行模式,其实无论哪种模式,PHP工作原理都是一样的。
本文主要介绍PHP程序的启动和停止在内核里面是走过了哪些过程,我们先来看一看内核中预置的几个宏:
PHP_MINIT_FUNCTION 初始化module时运行
PHP_MSHUTDOWN_FUNCTION 当module被卸载时运行
PHP_RINIT_FUNCTION 当一个REQUEST请求初始化时运行
PHP_RSHUTDOWN_FUNCTION 当一个REQUEST请求结束时运行
PHP_MINFO_FUNCTION 这个是设置phpinfo中这个模块的信息
PHP_GINIT_FUNCTION 初始化全局变量时
PHP_GSHUTDOWN_FUNCTION 释放全局变量时
PHP启动,可以理解为2个部分:
第一个是模块被加载的时候,可以理解为我们的PHP扩展在加载的时候,体现在PHP_MINIT_FUNCTION宏,比如PHP随Apache的启动而诞生在内存里时,会把所有已加载扩展的MINIT方法都执行一遍。 在这个过程里,扩展定义的一些常量、类、资源等所有PHP脚本用到的东西都会随Apache常驻内存,可以被所有请求使用,直到Apache卸载PHP模块。
第二个是当一个页面请求被发送到PHP的时候,PHP会有一次启动,也是广义上的PHP启动,体现在PHP_RINIT_FUNCTION宏,比如Apache发送一个请求到PHP,PHP会迅速的开辟一个新的环境,并重新扫描各个扩展,遍历执行各个扩展的RINIT方法,这时候一个扩展可能会初始化在本次请求中会使用到的变量等。
停止反之,分别体现在PHP_MSHUTDOWN_FUNCTION宏和PHP_RSHUTDOWN_FUNCTION宏。
这里有一段测试代码:int minit_time;
PHP_MINIT_FUNCTION(test)
{
minit_time = time(NULL);
return SUCCESS;
}
PHP_MSHUTDOWN_FUNCTION(test)
{
FILE *fp=fopen("mshutdown.txt","a+");
fprintf(fp,"%ld\n",time(NULL));
fclose(fp);
return SUCCESS;
}
int rinit_time;
PHP_RINIT_FUNCTION(test)
{
rinit_time = time(NULL);
return SUCCESS;
}
PHP_RSHUTDOWN_FUNCTION(test)
{
FILE *fp=fopen("rshutdown.txt","a+");
fprintf(fp,"%ld\n",time(NULL));
fclose(fp);
return SUCCESS;
}
PHP_MINFO_FUNCTION(test)
{
php_info_print_table_start();
php_info_print_table_header(, "module info", "enabled");
php_info_print_table_end();
/* Remove comments if you have entries in php.ini
DISPLAY_INI_ENTRIES();
*/
}
PHP_FUNCTION(test)
{
php_printf("%d",minit_time);
php_printf("%d",rinit_time);
return;
}
测试的结果如下:
minit_time的值每次请求都不变。
rinit_time的值每次请求都改变。
每次页面请求都会往rshutdown.txt中写入数据。
只有在apache结束后mshutdown.txt才写入数据。
打赏
微信扫一扫,打赏作者吧~