PHP源码分析-PHP的生命周期

来源:互联网 发布:linux运维之道 mobi 编辑:程序博客网 时间:2024/06/05 20:04

PHP的最多的两种运行模式是WEB模式、CLI模式。
无论哪种模式,PHP工作原理都是一样的,作为一种SAPI运行。
1、当我们在终端敲入php这个命令的时候,它使用的是CLI。

它就像一个web服务器一样来支持php完成这个请求,请求完成后再重新把控制权交给终端。

2、当使用Apache作为宿主时,当一个请求到来时,PHP会来支持完成这个请求。


main/php.h中定义了以下几个宏

[cpp] view plain copy
  1. #define PHP_MINIT_FUNCTION      ZEND_MODULE_STARTUP_D  
  2. #define PHP_MSHUTDOWN_FUNCTION  ZEND_MODULE_SHUTDOWN_D  
  3. #define PHP_RINIT_FUNCTION      ZEND_MODULE_ACTIVATE_D  
  4. #define PHP_RSHUTDOWN_FUNCTION  ZEND_MODULE_DEACTIVATE_D  
  5. #define PHP_MINFO_FUNCTION      ZEND_MODULE_INFO_D  
  6. #define PHP_GINIT_FUNCTION      ZEND_GINIT_FUNCTION  
  7. #define PHP_GSHUTDOWN_FUNCTION  ZEND_GSHUTDOWN_FUNCTION  

对应的作用是
[html] view plain copy
  1. PHP_MINIT_FUNCTION  初始化module时运行  
  2. PHP_MSHUTDOWN_FUNCTION  当module被卸载时运行  
  3. PHP_RINIT_FUNCTION  当一个REQUEST请求初始化时运行  
  4. PHP_RSHUTDOWN_FUNCTION  当一个REQUEST请求结束时运行  
  5. PHP_MINFO_FUNCTION  这个是设置phpinfo中这个模块的信息  
  6. PHP_GINIT_FUNCTION  初始化全局变量时  
  7. PHP_GSHUTDOWN_FUNCTION  释放全局变量时  

看一个自定义扩展案例片段:
[cpp] view plain copy
  1. int minit_time;  
  2. PHP_MINIT_FUNCTION(test)  
  3. {  
  4.     minit_time = time(NULL);  
  5.     return SUCCESS;  
  6. }  
  7.   
  8. PHP_MSHUTDOWN_FUNCTION(test)  
  9. {  
  10.     FILE *fp=fopen("mshutdown.txt","a+");  
  11.     fprintf(fp,"%ld\n",time(NULL));//让我们看看是不是每次请求结束都会在这个文件里追加数据  
  12.     fclose(fp);  
  13.     return SUCCESS;  
  14. }  
  15.   
  16. int rinit_time;  
  17. PHP_RINIT_FUNCTION(test)  
  18. {  
  19.     rinit_time = time(NULL);  
  20.     return SUCCESS;  
  21. }  
  22.   
  23.   
  24. PHP_RSHUTDOWN_FUNCTION(test)  
  25. {  
  26.     FILE *fp=fopen("rshutdown.txt","a+");  
  27.     fprintf(fp,"%ld\n",time(NULL));//让我们看看是不是每次请求结束都会在这个文件里追加数据  
  28.     fclose(fp);  
  29.     return SUCCESS;  
  30. }  
  31.   
  32. PHP_MINFO_FUNCTION(test)  
  33. {  
  34.     php_info_print_table_start();//调用php_write输出HTML标签  
  35.     php_info_print_table_header(2, "module info""enabled");  
  36.     php_info_print_table_end();//调用php_write输出HTML标签  
  37.   
  38.     /* Remove comments if you have entries in php.ini 
  39.     DISPLAY_INI_ENTRIES(); 
  40.     */  
  41. }  
  42.   
  43. //定义PHP中可以调用的函数test(),让它在页面里输出minit_time和rinit_time的值  
  44. PHP_FUNCTION(test)  
  45. {  
  46.     php_printf("%d<br />",time_of_minit);  
  47.     php_printf("%d<br />",time_of_rinit);  
  48.     return;  
  49. }  

以Apache为例,
如果在多线程的模式下工作:
在这种模式下,只有一个服务器进程在运行着,但会同时运行很多线程,这样可以减少一些资源开销,向Module init和Module shutdown就只需要运行一遍就行了,一些全局变量也只需要初始化一次,因为线程独具的特质,使得各个请求之间方便的共享一些数据成为可能。
多线程工作方式如下图:



如果在多进程的模式下工作:

minit_time、rinit_time的值每次请求都在变。
每次页面请求结束都会往time_rshutdown.txt、time_mshutdown.txt中写入数据。

下面是多进程工作模式图:


来源:http://blog.csdn.net/a600423444/article/details/7028905