はじめに
PHPを使っていると、パフォーマンスの問題や仕様上の欠点に遭遇することがあります。また、LinuxなどでPHPを動かしている場合、すでにある便利なライブラリをPHP上で使いたいケースもあるでしょう。このような時に、PHPエクステンションという選択肢は、開発者にとって非常に大きな強みになります。また、直接PHPエクステンションを作る用途がなくても、仕組みを知っておくと、PHPで原因不明の問題が発生した場合にも役立ちます。そして、そのような問題に遭遇しないための開発につながることもあります。
本連載ではPHPエクステンションを初めて作成する方のための全体の流れや、関数やクラスの作成方法、そして、より実践的にライブラリをPHPエクステンションとして利用する方法を紹介いたします。
対象読者
PHPとC言語の基本構文を理解していて、PHPエクステンションに興味がある方、さらに深くPHPを知りたい方を対象としています。
必要な環境
この記事では、PHP 5.4を使用し、Linux環境にて確認を行っています。また、PHPをソースからインストールするためにgccやautotoolsなどの開発ライブラリが必要です。
PHPエクステンション用のPHPのインストール
PHPエクステンションを作る際には、実運用のPHPとは分けてインストールします。これは、エクステンション作成に必要なコマンドがソースコードのアーカイブに含まれるためです。また、このコマンドを使用して作成したプログラムは、そのソースコードのバージョンに依存してしまうので、無用なトラブルを避ける意味でも新たにインストールします。また、今回は既存のPHPを上書きしないように、別のフォルダにPHPエクステンション用のPHPをインストールします。
まず、PHP 5.4をダウンロードします。今回は最新版である、PHP 5.4.16を利用します。
$ wget http://jp2.php.net/get/php-5.4.16.tar.gz/from/this/mirror $ tar xvfz php-5.4.16.tar.gz $ cd php-5.4.16 $ ./configure --prefix=/usr/local/php-ext --enable-debug $ make $ sudo make install
このインストールにおいて、注意すべきことは--enable-debugオプションの付与です。このオプションを付けることで、メモリリークの追跡ができるようになります。ただし、メモリリークは実行結果ではわからない場合が多々あります。ですから必ずこのオプションを付けて、メモリリークがないことを確認してください。
エクステンションの枠組みを作る
PHPエクステンションを作る上でPHPのソースコードには、スケルトン(枠組み)を作るためのext_skelスクリプトが用意されています。今回はそのスクリプトを用いて、helloworldという名前のモジュールを作業しているユーザのHOMEディレクトリ上のphpextディレクトリに作成します。
ext_skelスクリプトには--extnameオプションにモジュール名を指定し、また、--skelオプションには使用するソースのスケルトンのパスを指定します。この2つのオプションを覚えておけば、エクステンションの開発に困ることはほぼないとみてよいでしょう。また、より詳しく知りたい方は、PHPのマニュアルを参照してください。以下にコマンドの実行と、その結果を示します。
$ cd $HOME $ mkdir phpext $ cd phpext $ /usr/local/src/php-5.4.16/ext/ext_skel --extname=helloworld --skel=/usr/local/src/php-5.4.16/ext/skeleton/ Creating directory helloworld Creating basic files: config.m4 config.w32 .svnignore helloworld.c php_helloworld.h CREDITS EXPERIMENTAL tests/001.phpt helloworld.php [done]. To use your new extension, you will have to execute the following steps: 1. $ cd .. 2. $ vi ext/helloworld/config.m4 3. $ ./buildconf 4. $ ./configure --[with|enable]-helloworld 5. $ make 6. $ ./php -f ext/helloworld/helloworld.php 7. $ vi ext/helloworld/helloworld.c 8. $ make Repeat steps 3-6 until you are satisfied with ext/helloworld/config.m4 and step 6 confirms that your module is compiled into PHP. Then, start writing code and repeat the last two steps as often as necessary.
実行すると、以下のようなファイルが作成されます。
ファイル名 | 概要 |
---|---|
config.m4 | UNIX用のビルドシステムファイル |
config.w32 | Windows用のビルドシステムファイル(今回は利用しません) |
CREDITS | 配布時に添付する場合のためのファイル(今回は利用しません) |
EXPERIMENTAL | 配布時に添付する場合のためのファイル(今回は利用しません) |
helloworld.c | エクステンションのソース |
helloworld.php | エクステンションを確認するためのPHPプログラム |
php_helloworld.h | エクステンションのヘッダファイル |
tests/001.phpt | PEARを用いたテスト用のファイル(今回は利用しません) |
.svnignore | subversionのリポジトリに登録する際に無視するファイル一覧(今回は利用しません) |
プログラムの本体がhelloworld.cであり、そのヘッダファイルがphp_helloworld.hになります。これらを使ってプログラムを記述していくので、その意味はわかりやすいと思います。また、helloworld.phpは実際にPHPを通しての確認用スクリプトです。
今回利用する中で最もわかりにくいと思われるのが、config.m4というファイルです。これはconfigureオプションの作成用で、自分で作ったエクステンションを正しくビルドするためのオプションを作成するファイルとなっています。
他のライブラリに依存する場合や、任意のオプションを用意する場合にはこのファイルを編集することになりますが、今回のサンプルでは追加の必要はありません。よって、作成されたファイルの16行から19行目の以下の部分のコメント部分を削除するだけです。
dnl PHP_ARG_ENABLE(helloworld, whether to enable helloworld support, dnl Make sure that the comment is aligned: dnl [ --enable-helloworld Enable helloworld support])
dnlの部分がコメントになります。この部分を削除した結果は以下のとおりです。
PHP_ARG_ENABLE(helloworld, whether to enable helloworld support, Make sure that the comment is aligned: [ --enable-helloworld Enable helloworld support])
このPHP_ARG_ENABLEというのは、configureを作成するためのマクロです。下記のとおり、関数のように使うことができます。
PHP_ARG_ENABLE([モジュール名],[configure時に出力するコメント],[configure --helpの時に出力するコメント])
より詳しく知りたい方は、PHP:UNIX用のビルドシステム:config.m4を参照ください。
これで一通りの準備がそろいました。