$_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;
}
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;
}
'PHP' 카테고리의 다른 글
[PHP Extension] lxr.php.net (OpenGrok) (0) | 2010.08.05 |
---|---|
[PHP Extension] INI 세팅 (0) | 2010.08.04 |
[PHP Extension] Extension Globals (모듈 전역변수) (0) | 2010.08.04 |
[PHP Extension] 상수 (Constants) (0) | 2010.08.04 |
[PHP Extension] phpinfo() 에 extension 정보 출력하기 (0) | 2010.08.04 |