拡張モジュール

を作ってみた。
PHPから拡張モジュール経由で「Hello World!」と出力したかっただけなのに、結構てこずってしまった。忘れないようにメモ。

# cd {PHPのソースファイル}/ext/
# ./ext_skel --extname="hello"
# cd hello
# vi hello.c

zend_function_entry hello_functions[] = {
    PHP_FE(confirm_hello_compiled,  NULL)
    PHP_FE(say_hello,   NULL)       /* 追加 */
    {NULL, NULL, NULL}
};

/*
  Say Hello モジュール
*/
PHP_FUNCTION(say_hello)
{
    char *arg = NULL;
    int arg_len, len;
    char string[256];

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {
        return;
    }

    len = sprintf(string, "Hello World!! Mr.%78s", arg);

    RETURN_STRINGL(string, len, 1);
}

# vi php_hello.h

PHP_FUNCTION(confirm_hello_compiled);   /* For testing, remove later. */
PHP_FUNCTION(say_hello);        /* 追加*/

# vi .config.m4

PHP_ARG_ENABLE(hello, whether to enable hello support,
Make sure that the comment is aligned:
[  --enable-hello           Enable hello support])

SEARCH_FOR="/include/hello.h"  # you most likely want to change this

LIBNAME=hello # you may want to change this
LIBSYMBOL=hello_do # you most likely want to change this

# phpize
# ./configure
# make
# make install

# cd {PHP_HOME}/extensions
# ln -s extensions/no-debug-non-zts-20020429*1/hello.so hello.so


ここまで出来たらあとはサンプルのPHPを作るだけ。
書いたコードはこんな感じ。

<?php
dl('hello.so');
print say_hello('hogehoge');
?>

ブラウザにアクセスしてみる。

Hello World!! Mr. hogehoge

無事に出力されました。

hello.cやphp_hello.hの修正はなんとなく理解できるんだけど、config.m4の修正内容がいまいち理解できず。最後のは、soの名前を決めてるんだと思うけど、最初の三行はなんだろう・・・。消すと、make installに失敗するんだよなぁ。もう少し調べてみよう。

*1:環境によって名前は微妙に違うかも