Problem Solving/나를 위한 개발

[20080702] php에서 c확장기능 구현

끄적끄적 2008. 7. 2. 11:49

회사에서 인증등 보안이 필요한 부분에 대해 php내에서 zend기능을 통해 c확장기능을 구현해 놓고 쓴다.
그런데, 기존에 구현되어 있는 부분이라 소스도 복잡하고, 이 부분이 왜 들어갔을까 하는 부분을 알기 힘들기 때문에, 기존 소스에 구애받지 않고, 직접 간단하게 c확장기능을 구현하는 부분을 테스트 해보았다.

참고로, zend라고 검색을 하면 주로 php성능향상을 위해 zend사에서 내놓은 엔진에 대한 내용이 많은데,
http://kr.php.net/manual/en/zend.php#zend.intro
위 사이트에서 보면 php에서 c와 같은 다른 언어의 함수등을 호출해서 쓸 수 있는 기능으로도 불린다..

우선 다음과 같이 c로 test.c를 만든다.

#include "php.h"
 
ZEND_FUNCTION(hello);
 
zend_function_entry test_functions[] = {
        ZEND_FE(hello, NULL)
        { NULL, NULL, NULL }
};
 
zend_module_entry test_module_entry = {
        STANDARD_MODULE_HEADER,
        "test",
        test_functions,
        NULL,
        NULL,
        NULL,
        NULL,
        NULL,
        NO_VERSION_YET,
        STANDARD_MODULE_PROPERTIES
};
 
ZEND_GET_MODULE(test)
 
ZEND_FUNCTION(hello)
{
        char *s;
        int s_len, ret;
 
        zend_printf("Hello, ZendApi<br>\n");
        if ( zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &s, &s_len) == FAILURE ) {
                return;
        }
        ret = 2;
 
        //ZVAL_LONG(return_value, ret);
        RETURN_LONG(ret);
}
컴파일을 하고,
gcc -fpic -I/usr/local/include  -I/user/wh/libexec/wwwsrc/php-5.2.5/Zend -I/user/wh/libexec/wwwsrc/php-5.2.5/main -I/user/wh/libexec/wwwsrc/php-5.2.5/TSRM -I/user/wh/libexec/wwwsrc/php-5.2.5 -c -o test.o test.c

gcc -shared -L/usr/local/lib -rdynamic -o test.so test.o
생성된 test.so파일을 so파일들을 모아놓는 폴더에 넣은 후 php.ini에 extension=test.so 를 추가해 준후,
아파치를 다시 올린다.

다음과 같은 테스트 php를 통해 해당 c함수가 잘 실행되는지 확인하기

<?php
$br = (php_sapi_name() == "cli")? "":"<br>";
 
if(!extension_loaded('test')) {
        dl('test.' . PHP_SHLIB_SUFFIX);
}
$module = 'test';
$functions = get_extension_funcs($module);
echo "Functions available in the test extension:$br\n";
foreach($functions as $func) {
    echo $func."$br\n";
}
echo "$br\n";
 
$ret = hello("test message");
echo $ret;
?>
브라우저를 통해 해당 값이 잘 찍히는 걸 확인할 수 있다.
Functions available in the test extension:
hello

Hello, ZendApi
2

참고내용 : http://phpschool.com/classroom/phpext/phpext_1.html
              http://www.imaso.co.kr/?doc=bbs/gnuboard_pdf.php&bo_table=article&page=2&wr_id=1040&publishdate=20030201
http://kldp.org/HOWTO/html/Program-Library-HOWTO/index.html
반응형