摘要:起步引擎提供了另種管理設置值的途徑。假設我們需要為我們擴展定義一個值并用函數返回它的內容。在為了避免命名空間的沖突,我們擴展的名字作為所有值的前綴。僅僅是一種約定,一個句點用來分隔擴展名和說明性的初始設定名字。
起步
Zend引擎提供了另種管理設置值(INI)的途徑。現在弄個簡單的,我們經常看到php.ini里有諸如 display_errors = On 這樣的全局設置。假設我們需要為我們擴展定義一個值: hello.greeting 并用函數 hello_ini() 返回它的內容。
在php.ini:
[hello] hello.greeting=1
為了避免命名空間的沖突,我們擴展的名字作為所有值的前綴。僅僅是一種約定,一個句點用來分隔擴展名和說明性的初始設定名字。
聲明變量 php_hello.h用ext_skel 工具初始化的擴展有個好處就是它能幫我們在特定的位置寫上注釋。
/* Declare any global variables you may need between the BEGIN and END macros here: ZEND_BEGIN_MODULE_GLOBALS(hello) zend_long global_value; char *global_string; ZEND_END_MODULE_GLOBALS(hello) */
這是說如果我們需要聲明全局變量,需要將放置在 宏 BEBIN與END之間。并提供了示例,因此在這邊添加:
ZEND_BEGIN_MODULE_GLOBALS(hello) zend_long greeting; ZEND_END_MODULE_GLOBALS(hello)
ZEND_BEGIN_MODULE_GLOBALS()和ZEND_END_MODULE_GLOBALS()用來創建一個名為zend_hello_globals的結構,它包含一個long型的變量。然后有條件地將HELLO_G()定義為從線程池中取得數值,或者從全局作用域中得到-如果你編譯的目標是非多線程環境。
工具還為我生成了:
/* Always refer to the globals in your function as HELLO_G(variable). You are encouraged to rename these macros something shorter, see examples in any other php module directory. */ #define HELLO_G(v) ZEND_MODULE_GLOBALS_ACCESSOR(hello, v) #if defined(ZTS) && defined(COMPILE_DL_HELLO) ZEND_TSRMLS_CACHE_EXTERN() #endif #endif
這是一個簡化變量獲取操作的宏設置,可以使用 HELLO_G(greeting) 來獲得全局設置的變量。
源碼實現 hello.c/* {{{ PHP_INI */ /* Remove comments and fill if you need to have entries in php.ini PHP_INI_BEGIN() STD_PHP_INI_ENTRY("hello.global_value", "42", PHP_INI_ALL, OnUpdateLong, global_value, zend_hello_globals, hello_globals) STD_PHP_INI_ENTRY("hello.global_string", "foobar", PHP_INI_ALL, OnUpdateString, global_string, zend_hello_globals, hello_globals) PHP_INI_END() */ /* }}} */
注釋說明可以自己看一下,在這下方添加:
ZEND_DECLARE_MODULE_GLOBALS(hello) PHP_INI_BEGIN() STD_PHP_INI_ENTRY("hello.greeting","0", PHP_INI_ALL, OnUpdateLong, greeting, zend_hello_globals, hello_globals) PHP_INI_END()
用ZEND_DECLARE_MODULE_GLOBALS()宏來例示zend_hello_globals結構.初始值 "0" 是在php.ini里沒有對應實體的時候生效的。
全局初始函數:
static void php_hello_init_globals(zend_hello_globals *hello_globals) { //hello_globals->global_value = 0; //hello_globals->global_string = NULL; }
php_hello_init_globals()實際上什么也沒做,卻得多聲明個RINIT將變量greeting初始化為0,為什么?
關鍵在于這兩個函數何時調用。php_hello_init_globals()只是在一個新的進程或線程時被調用;然而,每個進程都能處理多個請求,所以這個函數將變量初始化為0將只在第一個頁面請求時運行。
接下來就是hello_ini()函數的實現了:
PHP_FUNCTION(hello_ini) { RETURN_LONG(HELLO_G(greeting)); } const zend_function_entry hello_functions[] = { PHP_FE(hello, NULL) PHP_FE(hello_ini, NULL) /*添加到編譯中去*/ PHP_FE(confirm_hello_compiled, NULL) PHP_FE_END };
一些諸如PHP_MINIT_FUNCTION也要修改,這些函數目前不知道作用是什么:
PHP_MINIT_FUNCTION(hello) { REGISTER_INI_ENTRIES(); return SUCCESS; } PHP_MSHUTDOWN_FUNCTION(hello) { UNREGISTER_INI_ENTRIES(); return SUCCESS; }修改配置
寫個hello_change_ini()來修改配置項:
PHP_FUNCTION(hello_change_ini) { HELLO_G(greeting) ++; }
同樣要加到 hello_functions[] 中。
測試"; echo hello_ini(); //2
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/22066.html
摘要:編譯工具這個腳本主要生成了編譯需要的配置以及擴展的基本結構這個腳本主要是獲取的安裝信息用于生成文件編寫擴展的基本步驟通過目錄下腳本生成擴展的基本框架修改配置設置編譯配置參數設置擴展的源文件依賴庫函數檢查等等定義一個這樣的編譯參數 1. 編譯工具 (a).ext_skel:這個腳本主要生成了編譯需要的配置以及擴展的基本結構 (b).php-config:這個腳本主要是獲取PHP的安裝信息...
摘要:告訴引擎要取的參數的信息,用來確保線程安全,返回值檢測是還是。數組遍歷假設我們需要一個取代以下功能的擴展的遍歷數組和差很多,提供了一些專門的宏來遍歷元素或。是一個關于線程安全的動作,用于避免各線程的作用域被其他的侵入。 起步 到這已經能聲明簡單函數,返回靜態或者動態值了。定義INI選項,聲明內部數值或全局數值。本章節將介紹如何接收從調用腳本(php文件)傳入參數的數值,以及 PHP內核...
摘要:但在密集計算方面比等靜態編譯語言差幾十倍甚至上百倍。一使用棧內存在引擎和擴展中,經常要創建一個的變量,底層就是一個指針。代碼中創建的變量也進行了優化,直接在棧內存上預分配。應用層與底層在錯誤拋出的方式全部統一為異常。 原文:http://rango.swoole.com/archives/440最近PHP官方終于發布了傳說中的PHP7,雖然只是alpha版。PHP7號稱是新一代的PHP...
摘要:我們為了處理這些挑戰,提出了一個新的引用測試框架當然,也是開源的,并且在整個過程中節省了上百萬美元。另一方面,被證實有一些嚴重的缺點部署困難而且慢。在緩存刷新期間,當可用于別的進程的已緩存的文件字節碼在此時損壞,就會導致崩潰。 How Badoo saved one million dollars switching to PHP7 我們成功的把我們的應用遷移到了php7上面(數百臺機...
摘要:以上例程會輸出返回值類型聲明增加了對返回類型聲明的支持。整數除法函數從移植到可為空類型參數以及返回值的類型現在可以通過在類型前加上一個問號使之允許為空。對于函數來說,不是一個合法的返回值。對于返回值,子類可以拓寬父類的或對象返回值類型到。 PHP5.5 ~ PHP7.2 新特性整理 官方文檔:http://php.net/manual/zh/appe... 一、從PHP 5.5.x ...
閱讀 841·2021-11-15 17:58
閱讀 3641·2021-11-12 10:36
閱讀 3779·2021-09-22 16:06
閱讀 956·2021-09-10 10:50
閱讀 1325·2019-08-30 11:19
閱讀 3309·2019-08-29 16:26
閱讀 928·2019-08-29 10:55
閱讀 3341·2019-08-26 13:48