Welcome 微信登录

首页 / 网页编程 / PHP / php的生命周期详解

php的生命周期详解2013-09-06php的生命周期

在常见的webserver环境中, 你不能直接启动php解释器; 一般是启动apache或其他webserver, 由它们加载php处理需要处理的脚本(请求的.php文档).

一切都从sapi开始

尽管看起来有所不同, 但实际上CLI的行为和web方式一致. 在命令行中键入php命令将启动"命令行sapi", 它实际上就像一个设计用于服务单请求的迷你版webserver. 当脚本运行完成后, 这个迷你的php-webserver终止并返回控制给shell.

启动和终止

这里的启动和终止过程分为两个独立的启动阶段和两个独立的终止阶段. 一个周期用于php解释器整体执行所需结构和值的初始化设置, 它们在sapi生命周期中持久存在. 另一个则仅服务于单页面请求, 生命周期短暂一些.

初始化启动在所有的请求发生之前, php调用每个扩展的MINIT(模块初始化)方法. 这里, 扩展可能会定义常量, 定义类, 注册资源, 流, 过滤处理器等所有将要被请求脚本所使用的资源. 所有这些都有一个特性, 就是它们被设计跨所有请求存在, 也可以称为"持久".

常见的MINIT方法如下:

/* 初始化myextension模块* 这在sapi启动后将立即发生*/PHP_MINIT_FUNCTION(myextension){/* 全局: 第12章 */#ifdef ZTSts_allocate_id(&myextension_globals_id,sizeof(php_myextension_globals),(ts_allocate_ctor) myextension_globals_ctor,(ts_allocate_dtor) myextension_globals_dtor);#elsemyextension_globals_ctor(&myextension_globals TSRMLS_CC);#endif/* REGISTER_INI_ENTRIES() 指向一个全局的结构, 我们将在第13章"INI设置"中学习 */REGISTER_INI_ENTRIES();/* 等价于define("MYEXT_MEANING", 42); */REGISTER_LONG_CONSTANT("MYEXT_MEANING", 42, CONST_CS | CONST_PERSISTENT);/* 等价于define("MYEXT_FOO", "bar"); */REGISTER_STRING_CONSTANT("MYEXT_FOO", "bar", CONST_CS | CONST_PERSISTENT);/* 资源: 第9章 */le_myresource = zend_register_list_destructors_ex(php_myext_myresource_dtor, NULL,"My Resource Type", module_number);le_myresource_persist = zend_register_list_destructors_ex(NULL, php_myext_myresource_dtor,"My Resource Type", module_number);/* 流过滤器: 第16章 */if (FAILURE == php_stream_filter_register_factory("myfilter", &php_myextension_filter_factory TSRMLS_CC)) {return FAILURE;}/* 流包装器: 第15章 */if (FAILURE == php_register_url_stream_wrapper ("myproto", &php_myextension_stream_wrapper TSRMLS_CC)) {return FAILURE;}/* 自动全局变量: 第12章 */#ifdef ZEND_ENGINE_2if (zend_register_auto_global("_MYEXTENSION", sizeof("_MYEXTENSION") - 1,NULL TSRMLS_CC) == FAILURE) {return FAILURE;}zend_auto_global_disable_jit ("_MYEXTENSION", sizeof("_MYEXTENSION") - 1 TSRMLS_CC);#elseif (zend_register_auto_global("_MYEXTENSION", sizeof("_MYEXTENSION") - 1 TSRMLS_CC) == FAILURE) {return FAILURE;}#endifreturn SUCCESS;}