[PHP Extension] Auto Globals

PHP 2010. 8. 4. 15:24



$_GET, $_POST 같은 auto global 을 확장모듈에서 선언하는 법.
초기화를 위해 callback 함수를 선언하는데 ZendEngine1(PHP4)에는 callback이 없기 때문에 RINIT에서 명시적으로 해줘야 함.

아래는 그 예제.
나머지는 그냥 있다 치고, MINIT와 RINIT, 그리고 초기화 콜백함수만 적음.
아래와 같이 해놓고 빌드해서 모듈 생성 후 PHP에서 var_dump($_MYEXT) 해보자.

// callback
zend_bool php_myext_autoglobal_callback(char *name, uint name_len TSRMLS_DC)
{
    zval *myext_val;
    int i;

    MAKE_STD_ZVAL(myext_val);
    array_init(myext_val);
    for (i=0; i<10; i++) add_next_index_long(myext_val, i);
    ZEND_SET_GLOBAL_VAR("_MYEXT", myext_val);

    return 0;
}

// MINIT
PHP_MINIT_FUNCTION(myext)
{
    // auto global 등록
    zend_register_auto_global("_MYEXT", sizeof("_MYEXT")-1,
#ifdef ZEND_ENGINE_2
        php_myext_autoglobal_callback
#endif
        TSRMLS_CC);

    return SUCCESS;
}

// RINIT
PHP_RINIT_FUNCTION(myext)
{
// ZendEngine1(PHP4)일 때에만 명시적으로 초기화 함수 호출
#ifndef ZEND_ENGINE_2
    php_myext_autoglobal_callback("_MYEXT", sizeof("_MYEXT")-1, TSRMLS_CC);
#endif       

    return SUCCESS;
}










Posted by bloodguy
,