程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> php的INI設置

php的INI設置

編輯:PHP綜合

INI設置

和上一章你看到的超級全局變量以及持久化常量一樣, php.ini值必須在擴展的MINIT代碼塊中定義. 然而, 和其他特性不同的是, INI選項的定義僅僅由簡單的啟動/終止線組成.

PHP_MINIT_FUNCTION(sample4)  
{  
    REGISTER_INI_ENTRIES();  
    return SUCCESS;  
}  
PHP_MSHUTDOWN_FUNCTION(sample4)  
{  
    UNREGISTER_INI_ENTRIES();  
    return SUCCESS;  
}

定義並訪問INI設置

INI指令自身是在源碼文件中MINIT函數上面, 使用下面的宏完全獨立的定義的, 在這兩個宏之間可以定義一個或多個INI指令:

PHP_INI_BEIGN()  
PHP_INI_END()

這兩個宏函數和ZEND_BEGIN_MODULE_GLOBALS()/ZEND_END_MODULE_GLOBALS()異曲同工. 不過這裡不是typdef一個結構體, 而是對靜態數據實例定義的框架組織:

static zend_ini_entry ini_entries[] = {  
{0,0,NULL,0,NULL,NULL,NULL,NULL,NULL,0,NULL,0,0,NULL} };

如你所見, 它定義了一個zend_ini_entry值的向量, 以一條空的記錄結束. 這和你在前面看到的靜態向量function_entry的定義一致.

簡單的INI設置

現在, 你已經有一個INI結構體用於定義INI指令, 以及引擎注冊/卸載INI設置的機制, 因此我們可以真正的去為你的擴展定義一些INI指令了. 假設你的擴展暴露了一個打招呼的函數, 就像第5章"你的第一個擴展"中一樣, 不過, 你想讓打招呼的話可以自定義:

PHP_FUNCTION(sample4_hello_world)  
{  
    php_printf("Hello World!\n");  
}

最簡單最直接的方式就是定義一個INI指令, 並給它一個默認值"Hello world!":

#include "php_ini.h"  
PHP_INI_BEGIN()  
    PHP_INI_ENTRY("sample4.greeting", "Hello World",  
                                    PHP_INI_ALL, NULL)  
PHP_INI_END()

你可能已經猜到了, 這個宏的前兩個參數表示INI指令的名字和它的默認值. 第三個參數用來確定引擎是否允許這個INI指令被修改(這將涉及到本章後面要介紹的訪問級別問題). 最後一個參數是一個回調函數, 它將在每次INI指令的值發生變化時被調用. 你將在修改事件一節看到這個參數的細節.

譯注: 如果你和譯者一樣遇到結果和原著結果預期不一致時, 請在測試時, 在你的MINIT()函數中增加一句"REGISTER_INI_ENTRIES();"調用, 並確保該調用在你的MINIT中分配全局空間之後執行.

現在你的INI設置已經定義, 只需要在你的打招呼函數中使用就可以了.

PHP_FUNCTION(sample4_hello_world)  
{  
    const char *greeting = INI_STR("sample4.greeting");  
    php_printf("%s\n", greeting);  
}

一定要注意, char *的值是引擎所有的, 一定不要修改. 正因為這樣, 所以將你本地用來臨時存儲INI設置值的變量定義為const修飾. 當然, 並不是所有的INI值都是字符串; 還有其他的宏用來獲取整型, 浮點型以及布爾型的值:

long lval = INI_INT("sample4.intval");  
double dval = INI_FLT("sample4.fltval");  
zend_bool bval = INI_BOOL("sample4.boolval");

通常你想要知道的是INI設置的當前值; 不過, 作為補充, 存在幾個宏可以用來讀取未經修改的INI設置值:

const char *strval = INI_ORIG_STR("sample4.stringval");  
long lval = INI_ORIG_INT("sample4.intval");  
double dval = INI_ORIG_FLT("sample4.fltval");  
zend_bool bval = INI_ORIG_BOOL("sample4.boolval");

這個例子中, INI指令的名字"sample4.greeting"增加了擴展名作為前綴, 這樣來保證不會和其他擴展暴露的INI指令名字沖突. 對於私有的擴展來說, 這個前綴不是必須的, 但是對於商業化或開源發布的公開擴展還是鼓勵這樣做的.

訪問級別

對於INI指令, 開始總是有一個默認值. 多數情況下, 理想是保持默認值不變; 然而, 對於某些特殊的環境或者腳本內特定的動作, 這些值可能需要被修改. 如下表所示, INI指令的值可能在下面3個點被修改:

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved