成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

PHP7擴(kuò)展開(kāi)發(fā)(二):配置項(xiàng)與全局?jǐn)?shù)值

Mr_houzi / 1205人閱讀

摘要:起步引擎提供了另種管理設(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

相關(guān)文章

  • (PHP7內(nèi)核剖析-11) 模塊擴(kuò)展

    摘要:編譯工具這個(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的安裝信息...

    gplane 評(píng)論0 收藏0
  • PHP7擴(kuò)展開(kāi)發(fā)(三):參數(shù)、數(shù)組和Zvals

    摘要:告訴引擎要取的參數(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)核...

    hufeng 評(píng)論0 收藏0
  • 【天贏金創(chuàng)】PHP7與Swoole

    摘要:但在密集計(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...

    MingjunYang 評(píng)論0 收藏0
  • Badoo 告訴你切換到 PHP7 節(jié)省了 100 萬(wàn)美元

    摘要:我們?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ī)...

    biaoxiaoduan 評(píng)論0 收藏0
  • PHP5.5 ~ PHP7.2 新特性整理

    摘要:以上例程會(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 ...

    mrcode 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<