摘要:起步引擎提供了另種管理設(shè)置值的途徑。假設(shè)我們需要為我們擴(kuò)展定義一個(gè)值并用函數(shù)返回它的內(nèi)容。在為了避免命名空間的沖突,我們擴(kuò)展的名字作為所有值的前綴。僅僅是一種約定,一個(gè)句點(diǎn)用來(lái)分隔擴(kuò)展名和說(shuō)明性的初始設(shè)定名字。
起步
Zend引擎提供了另種管理設(shè)置值(INI)的途徑?,F(xiàn)在弄個(gè)簡(jiǎn)單的,我們經(jīng)??吹絧hp.ini里有諸如 display_errors = On 這樣的全局設(shè)置。假設(shè)我們需要為我們擴(kuò)展定義一個(gè)值: hello.greeting 并用函數(shù) hello_ini() 返回它的內(nèi)容。
在php.ini:
[hello] hello.greeting=1
為了避免命名空間的沖突,我們擴(kuò)展的名字作為所有值的前綴。僅僅是一種約定,一個(gè)句點(diǎn)用來(lái)分隔擴(kuò)展名和說(shuō)明性的初始設(shè)定名字。
聲明變量 php_hello.h用ext_skel 工具初始化的擴(kuò)展有個(gè)好處就是它能幫我們?cè)谔囟ǖ奈恢脤?xiě)上注釋。
/* 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) */
這是說(shuō)如果我們需要聲明全局變量,需要將放置在 宏 BEBIN與END之間。并提供了示例,因此在這邊添加:
ZEND_BEGIN_MODULE_GLOBALS(hello) zend_long greeting; ZEND_END_MODULE_GLOBALS(hello)
ZEND_BEGIN_MODULE_GLOBALS()和ZEND_END_MODULE_GLOBALS()用來(lái)創(chuàng)建一個(gè)名為zend_hello_globals的結(jié)構(gòu),它包含一個(gè)long型的變量。然后有條件地將HELLO_G()定義為從線程池中取得數(shù)值,或者從全局作用域中得到-如果你編譯的目標(biāo)是非多線程環(huán)境。
工具還為我生成了:
/* 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
這是一個(gè)簡(jiǎn)化變量獲取操作的宏設(shè)置,可以使用 HELLO_G(greeting) 來(lái)獲得全局設(shè)置的變量。
源碼實(shí)現(xiàn) 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() */ /* }}} */
注釋說(shuō)明可以自己看一下,在這下方添加:
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()宏來(lái)例示zend_hello_globals結(jié)構(gòu).初始值 "0" 是在php.ini里沒(méi)有對(duì)應(yīng)實(shí)體的時(shí)候生效的。
全局初始函數(shù):
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()實(shí)際上什么也沒(méi)做,卻得多聲明個(gè)RINIT將變量greeting初始化為0,為什么?
關(guān)鍵在于這兩個(gè)函數(shù)何時(shí)調(diào)用。php_hello_init_globals()只是在一個(gè)新的進(jìn)程或線程時(shí)被調(diào)用;然而,每個(gè)進(jìn)程都能處理多個(gè)請(qǐng)求,所以這個(gè)函數(shù)將變量初始化為0將只在第一個(gè)頁(yè)面請(qǐng)求時(shí)運(yùn)行。
接下來(lái)就是hello_ini()函數(shù)的實(shí)現(xiàn)了:
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也要修改,這些函數(shù)目前不知道作用是什么:
PHP_MINIT_FUNCTION(hello) { REGISTER_INI_ENTRIES(); return SUCCESS; } PHP_MSHUTDOWN_FUNCTION(hello) { UNREGISTER_INI_ENTRIES(); return SUCCESS; }修改配置
寫(xiě)個(gè)hello_change_ini()來(lái)修改配置項(xiàng):
PHP_FUNCTION(hello_change_ini) { HELLO_G(greeting) ++; }
同樣要加到 hello_functions[] 中。
測(cè)試"; echo hello_ini(); //2
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/22066.html
摘要:編譯工具這個(gè)腳本主要生成了編譯需要的配置以及擴(kuò)展的基本結(jié)構(gòu)這個(gè)腳本主要是獲取的安裝信息用于生成文件編寫(xiě)擴(kuò)展的基本步驟通過(guò)目錄下腳本生成擴(kuò)展的基本框架修改配置設(shè)置編譯配置參數(shù)設(shè)置擴(kuò)展的源文件依賴(lài)庫(kù)函數(shù)檢查等等定義一個(gè)這樣的編譯參數(shù) 1. 編譯工具 (a).ext_skel:這個(gè)腳本主要生成了編譯需要的配置以及擴(kuò)展的基本結(jié)構(gòu) (b).php-config:這個(gè)腳本主要是獲取PHP的安裝信息...
摘要:告訴引擎要取的參數(shù)的信息,用來(lái)確保線程安全,返回值檢測(cè)是還是。數(shù)組遍歷假設(shè)我們需要一個(gè)取代以下功能的擴(kuò)展的遍歷數(shù)組和差很多,提供了一些專(zhuān)門(mén)的宏來(lái)遍歷元素或。是一個(gè)關(guān)于線程安全的動(dòng)作,用于避免各線程的作用域被其他的侵入。 起步 到這已經(jīng)能聲明簡(jiǎn)單函數(shù),返回靜態(tài)或者動(dòng)態(tài)值了。定義INI選項(xiàng),聲明內(nèi)部數(shù)值或全局?jǐn)?shù)值。本章節(jié)將介紹如何接收從調(diào)用腳本(php文件)傳入?yún)?shù)的數(shù)值,以及 PHP內(nèi)核...
摘要:但在密集計(jì)算方面比等靜態(tài)編譯語(yǔ)言差幾十倍甚至上百倍。一使用棧內(nèi)存在引擎和擴(kuò)展中,經(jīng)常要?jiǎng)?chuàng)建一個(gè)的變量,底層就是一個(gè)指針。代碼中創(chuàng)建的變量也進(jìn)行了優(yōu)化,直接在棧內(nèi)存上預(yù)分配。應(yīng)用層與底層在錯(cuò)誤拋出的方式全部統(tǒng)一為異常。 原文:http://rango.swoole.com/archives/440最近PHP官方終于發(fā)布了傳說(shuō)中的PHP7,雖然只是alpha版。PHP7號(hào)稱(chēng)是新一代的PHP...
摘要:我們?yōu)榱颂幚磉@些挑戰(zhàn),提出了一個(gè)新的引用測(cè)試框架當(dāng)然,也是開(kāi)源的,并且在整個(gè)過(guò)程中節(jié)省了上百萬(wàn)美元。另一方面,被證實(shí)有一些嚴(yán)重的缺點(diǎn)部署困難而且慢。在緩存刷新期間,當(dāng)可用于別的進(jìn)程的已緩存的文件字節(jié)碼在此時(shí)損壞,就會(huì)導(dǎo)致崩潰。 How Badoo saved one million dollars switching to PHP7 我們成功的把我們的應(yīng)用遷移到了php7上面(數(shù)百臺(tái)機(jī)...
摘要:以上例程會(huì)輸出返回值類(lèi)型聲明增加了對(duì)返回類(lèi)型聲明的支持。整數(shù)除法函數(shù)從移植到可為空類(lèi)型參數(shù)以及返回值的類(lèi)型現(xiàn)在可以通過(guò)在類(lèi)型前加上一個(gè)問(wèn)號(hào)使之允許為空。對(duì)于函數(shù)來(lái)說(shuō),不是一個(gè)合法的返回值。對(duì)于返回值,子類(lèi)可以拓寬父類(lèi)的或?qū)ο蠓祷刂殿?lèi)型到。 PHP5.5 ~ PHP7.2 新特性整理 官方文檔:http://php.net/manual/zh/appe... 一、從PHP 5.5.x ...
閱讀 855·2021-11-15 17:58
閱讀 3658·2021-11-12 10:36
閱讀 3794·2021-09-22 16:06
閱讀 969·2021-09-10 10:50
閱讀 1333·2019-08-30 11:19
閱讀 3317·2019-08-29 16:26
閱讀 942·2019-08-29 10:55
閱讀 3349·2019-08-26 13:48