拡張モジュール
を作ってみた。
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:環境によって名前は微妙に違うかも