PHP的生命周期是一个很复杂的过程,其生命周期应该被热衷于使用它的人所掌握,主要内容如下,PHP启动,如果运行的是CLI或者FPM,它将运行【C?main()】。,探索PHP生命周期
在你分析 PHP 扩展结构时( struct _zend_module_entry { unsigned short size; unsigned int zend_api; unsigned char zend_debug; unsigned char zts; const struct _zend_ini_entry *ini_entry; const struct _zend_module_dep *deps; const char *name; const struct _zend_function_entry *functions; int (*module_startup_func)(INIT_FUNC_ARGS); /* MINIT() */ int (*module_shutdown_func)(SHUTDOWN_FUNC_ARGS); /* MSHUTDOWN() */ int (*request_startup_func)(INIT_FUNC_ARGS); /* RINIT() */ int (*request_shutdown_func)(SHUTDOWN_FUNC_ARGS); /* RSHUTDOWN() */ void (*info_func)(ZEND_MODULE_INFO_FUNC_ARGS); /* PHPINFO() */ const char *version; size_t globals_size; #ifdef ZTS ts_rsrc_id* globals_id_ptr; #else void* globals_ptr; #endif void (*globals_ctor)(void *global); /* GINIT() */ void (*globals_dtor)(void *global); /* GSHUTDOWN */ int (*post_deactivate_func)(void); /* PRSHUTDOWN() */ int module_started; unsigned char type; void *handle; int module_number; const char *build_id; }; 现在让我们看看你应该在这些钩子中编写哪种代码。 模块初始化:MINIT()这是 PHP 进程启动步骤。在扩展的 在 在 如果你需要为你的扩展注册 INI 入口,则 如果你要为以后使用而注册只读zend_strings,请使用持久分配了。 如果你需要分配的对象在处理请求时会写入,那么你必须复制它们的内存分配到该请求的线程专用池。记住,你只可以在
在 php_module_startup()函数中,通过 模块终止:MSHUTDOWN()这是 PHP 进程终止步骤。很容易, 基本上,你在这里运行了与 再次注意:执行引擎是关闭的,所以你不应在此处访问其任何变量。 由于你在此处不需要请求,所以不应使用Zend 内存管理 的 在php_module_shutdown()函数中,由 请求初始化: RINIT()刚刚看过的请求,PHP 将在这里处理它。在 在 在这里,你不应请求持久的动态内存,即 libc 的 另外,务必注意不要在这里写入全局空间。如果 PHP 作为选定的并行模型运行到线程中,那么你将修改每个线程池中的上下文(所有与你的请求并行处理的请求),并且如果你没有锁定内存,也可能触发竞争条件。如果你需要全局,你必须保护它们。
在php_request_startup()函数中,通过 请求终止: RSHUTDOWN()这是 PHP 请求终止步骤。PHP 刚结束处理其请求,现在来清理其部分作为无共享架构的内存。接下来的请求不应记住当前请求的任何内容。很容易,基本上,你在此处执行了与 由于你在此处使用了请求,你应使用 Zend 内存管理器的 给你个主意,
在php_request_shutdown()函数中,通过 Post 请求终止: PRSHUTDOWN()这个钩子很少使用。它在
这个钩子很少使用。在php_request_shutdown()函数中,通过 全局初始化: GINIT()线程库每次弹出线程时都会调用该钩子。如果你使用多进程,当 PHP 启动,仅在触发 这里不讲太多细节,只需在这里简单地初始化全局变量,通常初始化为0。全局管理将在专用章节详细说明。 记住,全局变量不会在每次请求后清理。如果你需要为每次新的请求重置它们(可能),那么你必须将这样地进程放到
全局终止: GSHUTDOWN()在线程库中,每当线程终止时都会调用该钩子。如果你使用多线程,该函数将在 PHP 终止期间(在 在这里不提供太多细节,你只需简单地在这里取消初始化你的全局变量,通常你不必做什么,但如果在构建全局( 全局管理将在专用章节详细介绍。 记住,全局变量在每次请求后不会清除。即
信息收集: MINFO()该钩子很特殊,它永远不会被引擎自动触发,只有你询问它有关扩展的信息时才会触发。典型的例子是调用 简而言之, 该函数也可以通过 CLI 使用反射开关之一调用,例如 你可以将其留空,在这种情况下,只有扩展的名字显示,没有其他(可能不会显示 INI 设置,因为这是 MINFO() 的一部分)。 关于 PHP 生命周期的思考你可能已经发现了, 我们想要再次引起你对内存管理的关注。在处理请求时(在 另外,如果你的崩溃信号是 SIGSEGV (坏内存访问),则整个进程会崩溃。如果 PHP 是使用线程作为多进程引擎,那么你所有其他线程也将崩溃,甚至可能造成服务器崩溃。
通过重写函数指针进行挂钩现在你知道引擎何时会触发代码,还存在值得注意的函数指针,你可以替换它们来挂载到引擎。因为那些指针是全局变量,因此你可以将它们替换为 感兴趣的有:
还有其他存在,但是上面的是最重要的,当你设计 PHP 扩展时,你可能需要。因为它们的名字很容易看,所以不再详细解释它们。 如果你需要更多信息,你可以在 PHP 源代码查看,并发现何时和如何触发它们。 以上就是探索PHP 生命周期的详细内容,更多请关注 模板之家(www.mb5.com.cn) 其它相关文章! |