[PHP Extension] INI 세팅

PHP 2010. 8. 4. 18:41



매크로를 이용하여 extension에서 ini 세팅하는 법.

#include "php_ini.h"

...

PHP_INI_BEGIN()
    PHP_INI_ENTRY("myext.strval", "Hello World", PHP_INI_ALL, NULL)
PHP_INI_END()


"myext.strval" => ini 이름
"Hello World"   => ini 값
PHP_INI_ALL   => 접근 레벨
  PHP_INI_ALL : php.ini, .htaccess, ini_set() 수정가능
  PHP_INI_SYSTEM|PHP_INI_PERDIR : php.ini, .htaccess 에서만 수정가능
  PHP_INI_SYSTEM : php.ini 에서만 수정가능
NULL => ini 가 수정될 경우 호출되는 callback 함수






ini 값 뽑아먹는 매크로
앞(INI_XXX)은 현재값이고 뒤(INI_ORIG_XXX)는 원래 정의되어 있는 값

INI_STR("myext.strval")  /  INI_ORIG_STR("myext.strval")
INI_INT()  /  INI_ORIG_INT()
INI_FLT() /  INI_ORIG_FLT()
INI_BOOL() /  INI_ORIG_BOOL()





ini 값 수정 callback 함수.

// 다음은 myext.strval 값이 변경되려 할 때마다 호출된다.
// 변경되려 하는 문자열의 길이가 0 이면 변경불가
ZEND_INI_MH(php_myext_modify_strval)
{
    if (new_value_length == 0) {
        return FAILURE;
    }
    return SUCCESS;
}

PHP_INI_BEGIN()
    PHP_INI_ENTRY("myext.strval", "Hello World", PHP_INI_ALL, php_myext_modify_strval);
PHP_INI_END()


// ZEND_INI_MH(php_myext_modify_strval) 매크로를 풀어내면 아래와 같은 함수형태
int php_myext_modify_strval(zend_ini_entry *entry,
    char *new_value, uint new_value_length,
    void *mh_arg1, void *mh_arg2, void *mh_arg3,
    int stage TSRMLS_DC);

entry : ini 구조체의 포인터. 그다지 신경쓰지 말자.
new_value : 변경하려는 문자열
new_value_length : 변경하려는 문자열 길이
mh_arg1, mh_arg2, mh_arg3 : 그다지 신경쓰지 말자.
stage : 변경하려 하는 시점 (STARTUP=MINIT, SHUTDOWN=MSHUTDOWN, ACTIVATE=RINIT, DEACTIVATE=RSHUTDOWN, RUNTIME=php 스크립트 실행시)








phpinfo() 시 ini 값 나타낼 때는 다음과 같이 해줌.

PHP_MINFO_FUNCTION(myext)
{
    DISPLAY_INI_ENTRIES();
}





ini와 모듈전역변수 연결

// String
STD_PHP_INI_ENTRY_EX(
    "myext.strval", // ini 이름
    "Hello World",  // ini 값
    PHP_INI_ALL,  // access level
    OnUpdateStringUnempty, // 변경시 빈문자열이면 변경불가. 빈문자열도 허용하려면 OnUpdateString
    strval, // 모듈전역변수 중 연결하고자 하는 변수
    zend_myext_globals, myext_globals) // 모듈전역변수 관련

// Long
STD_PHP_INI_ENTRY("myext.longval", "123", PHP_INI_ALL, OnUpdateLong, mylong,
    zend_myext_globals, myext_globals)

// Double
STD_PHP_INI_ENTRY("myext.doubleval", "3.14", PHP_INI_ALL, OnUpdateDouble, mydouble,
    zend_myext_globals, myext_globals)

// Boolean 값을 "on", "off"로 하고 싶다면 다음 매크로 사용
STD_PHP_INI_BOOLEAN("myext.boolval", "1", PHP_INI_ALL, OnUpdateBool, mybool,
    zend_myext_globals *, myext_globals)

// Boolean 값을 문자열 그대로 하고 싶다면 다음 매크로 사용
STD_PHP_INI_ENTRY("myext.boolval", "1", PHP_INI_ALL, OnUpdateBool, mybool,
    zend_myext_globals, myext_globals)






Posted by bloodguy
,