PHP7扩展开发(二):配置项与全局数值
起步
Zend引擎提供了另種管理設置值(INI)的途徑?,F在弄個簡單的,我們經??吹絧hp.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 BEGINand 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, seeexamples 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[] 中。
測試
<?php echo hello_ini(); //1 hello_change_ini(); echo "<br>"; echo hello_ini(); //2總結
以上是生活随笔為你收集整理的PHP7扩展开发(二):配置项与全局数值的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [deviceone开发]-数据绑定示例
- 下一篇: 动态规划算法php,php算法学习之动态