DEACTIVATION
调用所有通过register_shutdown_function()注册的函数。这些在关闭时调用的函数是在用户空间添加进来的。
执行所有可用的__destruct函数。这里的析构函数包括在对象池(EG(objects_store)中的所有对象的析构函数以及EG(symbol_table)中各个元素的析构方法。
<b>将所有的输出刷出去。</b><br>
发送HTTP应答头。这也是一个输出字符串的过程,只是这个字符串可能符合某些规范。<br>
遍历每个模块的关闭请求方法,执行模块的请求关闭操作,这就是我们在图中看到的Call each extension's RSHUTDOWN。<br>
销毁全局变量表(PG(http_globals))的变量。<br>
通过zend_deactivate函数,关闭词法分析器、语法分析器和中间代码执行器。
调用每个扩展的post-RSHUTDOWN函数。只是基本每个扩展的post_deactivate_func函数指针都是NULL。<br>
关闭SAPI,通过sapi_deactivate销毁SG(sapi_headers)、SG(request_info)等的内容。<br>
关闭流的包装器、关闭流的过滤器。<br>
关闭内存管理。<br>
重新设置最大执行时间<br>
结束
flush
sapi_flush将最后的内容刷新出去。其调用的是sapi_module.flush,在CLI模式下等价于fflush函数。
关闭Zend引擎(zend_shutdown将关闭Zend引擎。)
关闭所有的模块(会调用模块的module_shutdown_func方法,即PHP_RSHUTDOWN_FUNCTION宏产生的那个函数)
销毁全局函数表
销毁全局类表
销毁全局变量表
过zend_shutdown_extensions遍历zend_extensions所有元素,调用每个扩展的shutdown函数。