« 2006年12月 | トップページ | 2007年2月 »

2007年1月29日 (月)

[PHP]拡張モジュールを自作する

あけましおめでとうございます。といってもすでに1月も終わろうとしていますが ^^;
本年もヨロシクお願いします。

今年一発目のネタは、PHPで拡張モジュールを自分で作ってしまおうというネタです。

PHPはすでにいろいろな機能が、標準でついているのでほとんど自作する必要はありません。それ以外にもPEARPECL といった拡張モジュールもいろいろあるので、それらを使うといろいろなことができます。
しかし、ライセンスの問題であったり、パフォーマンスを出すために独自機能をスクリプト以外で作ろうとするためには、やはり自分で拡張モジュールを作る必要があります。

そこで今回は、実際に拡張モジュールを作ってみました。

方法は、すでに標準のPHPのソースの中に拡張モジュールを簡単に作る機能があるのでそれを使用していきます。

まずはじめに、関数の雛形を作ります。これは、実際にスクリプトから呼び出す関数の宣言を行うファイルで関数名とその関数の引数や戻り値を書いておきます。これを使用するとこの宣言しておいた関数を基にソースの中身を作成してくれるのであとの作業が楽になります。

test.protoファイルの内容
void myfunction_a(string szInput)・・・(1)
string myfunction_b(string szInput , int nIDs )・・・(2)
string myfunction_c(mixed mInput , array aIDs )・・・(3)

(1)は、引数が文字列で戻り値がなしの関数で(2)は戻り値が文字列で引数が文字列と整数型になっています。(3)の関数は戻り値が文字列で第1引数が何でもありで第2引数が配列型になっています。。
string」,「mixed」,「array」は、PHPの型です。
これ以外の型については、PHPのマニュアルの型の部分に書いてあるものが使用できるはずです。(「string」,「int」,「array」,「mixed」以外は試してませんがこれらについては雛形がきちんとできていました。)
ちなみに関数名に英大文字を使用すると怒られるようです。

関数の雛形ファイルを作成したら今度はこれを使用して実際のソースの雛形を作成します。

Windowsの場合はCygwinが必要になりますのでCygwinプロジェクトからダウンロードしてインストールをしておいてください。

Cygwinまたは、UNIXのシェルから以下のコマンドを発行してソースを作成します。

$ sh ext_skel --extname=test --proto=test.proto

「--extname」で拡張モジュールのパッケージ名を指定します。この指定した名前のディレクトリが作成されてその中にソースの雛形が作成されます。
「--proto」に先ほど作成した関数の雛形が書いてあるファイル名を指定します。それでこの関数の雛形がソースの中に作成されます。

作成されたディレクトリの中をみると以下のファイルが作成されています。

$ ls -l
合計 32
-rw-r--r--  1 shima  shima     4  1月 29 22:19 CREDITS
-rw-r--r--  1 shima  shima     0  1月 29 22:19 EXPERIMENTAL
-rw-r--r--  1 shima  shima    1975  1月 29 22:19 config.m4
-rw-r--r--  1 shima  shima   282  1月 29 22:19 config.w32
-rw-r--r--  1 shima  shima    2771  1月 29 22:19 php_test.h
-rw-r--r--  1 shima  shima    6467  1月 29 22:19 test.c
-rw-r--r--  1 shima  shima   496  1月 29 22:19 test.php
drwxr-xr-x  2 shima  shima    4096  1月 29 22:19 tests

「test.c」と「php_test.h」が関数の中身を実装していくファイルになります。このファイルに関しては、後は普通のCの関数として実装していけばよいです。戻り値や引数などの処理については、このほかの拡張モジュールのソースを参考にしていけば大変ですが実装は可能です。

関数の実装が終わった後は、組み込みを行います。そのまま組み込に条件「--with-XXX」とか「--enable-XXX」をつける場合は、「config.m4」と「config.w32」を編集して必要な部分からコメントの記号をのぞいて有効にします。
注意点ですが、「config.w32」で「--with-XXX」を有効にしたときにほかの部分のコメントを残しておいたまま処理を行った場合にうまくいきませんでした。うまくいかなかった場合は、先頭2行以外のコメント部分を完全に削除したほうがいいかもしれません。

組み込みは、buildconfを実行して「configure」スクリプトに反映させます。これを行わないとビルドしたときに組み込まれません。Windowsでは、「buildconf.bat」を実行します。

$ ./buildconf

ここでエラーが出なければ「configure」スクリプトを実行します。Windowsでは、「cscript /nologo configure.js」を実行します。ほかのオプションに関しては、必要なものを指定してください。

$ ./configure '--enable-mbstring' '--enable-mbregex' '--with-pcre-regex' '--enable-session' ・・・

続いてビルドします。

$ make

これでビルドのエラーが出なければ完成です。

もし、関数が正しく実装されたかどうかを確認する場合は、「tests」ディレクトリ内の「001.phpt」ファイル内に関数のテストコードを実装しておけば「make test」とビルド後に実行すれば自動的にテストを行ってきちんと動作しているか確認することができます。

以上で拡張モジュールを自分で作成する方法を簡単に説明しました。実際には、PHP独自の実装をいろいろ行わなければなりませんが似たような機能が実装されている拡張モジュールがほかにあると思いますのでそちらの関数を参考にしながら実装するのが簡単だと思います。くれぐれもそのままパクらないでくださいね。

| | コメント (0) | トラックバック (0)

« 2006年12月 | トップページ | 2007年2月 »