日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

PHP7扩展开发(二):配置项与全局数值

發布時間:2025/3/20 php 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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扩展开发(二):配置项与全局数值的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。