php的生命周期
在常見的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 ZTS ts_allocate_id(&myextension_globals_id, sizeof(php_myextension_globals), (ts_allocate_ctor) myextension_globals_ctor, (ts_allocate_dtor) myextension_globals_dtor); #else myextension_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_2 if (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); #else if (zend_register_auto_global("_MYEXTENSION", sizeof("_MYEXTENSION") - 1 TSRMLS_CC) == FAILURE) { return FAILURE; } #endif return SUCCESS; }