2006年10月26日
PHP Extension を作ろう第1回 - まずは Hello World
PHP で汎用的なライブラリを作成するフレームワークには大きく分けて2種類あるようです。
ひとつは PEAR のように PHP でクラスライブラリを作る方法、もう一つが今回紹介する PECL の様に PHP 自体を拡張するモジュールを書く方法です。
なぜ PHP Extension ?
ひとつは、過去に C で書かれた既存のライブラリを流用したい場合に PHP Extension を作成すれば自然に PHP のコードに結合することが出来ます。また、PEAR の様に PHP で書いたコードと比べると若干高速になります。
ひとつは PEAR のように PHP でクラスライブラリを作る方法、もう一つが今回紹介する PECL の様に PHP 自体を拡張するモジュールを書く方法です。
ひとつは、過去に C で書かれた既存のライブラリを流用したい場合に PHP Extension を作成すれば自然に PHP のコードに結合することが出来ます。また、PEAR の様に PHP で書いたコードと比べると若干高速になります。
それでは実際に helloworld という名前の PHP Extension を作成してみましょう。PHP のソースを展開すると php-x.x.x/ext というディレクトリがありますので
$ cd php-x.x.x/ext
$ ./ext_skel --extname=helloworld
を実行すると親切にもこれからすべき事が表示されます。
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
しかし上記に表示されているのは php に extention を組み込んでビルドする手順ですので無視しましょう。実際の PHP Extention 開発時には Extention 単体でのビルド&デバッグの方が効率的です。
# 上記の手順に従うにしても ./buildconf に --force オプションが必要です
先ほど作成した helloworld module を単体でビルドするには Extention のディレクトリに移動して
$ cd helloworld
まず config.m4 にある 以下の 3行のコメントインします。
$ vi config.m4
16,18c16,18
< dnl PHP_ARG_ENABLE(helloworld, whether to enable helloworld support,
< dnl Make sure that the comment is aligned:
< dnl [ --enable-helloworld Enable helloworld support])
---
> PHP_ARG_ENABLE(helloworld, whether to enable helloworld support,
> Make sure that the comment is aligned:
> [ --enable-helloworld Enable helloworld support])
続い以て下のコマンドを実行します。
$ phpize
$ ./configure
$ make
すると modules/helloworld.so のできあがりです。
さて、この自動生成されたスケルトンには最初から確認用の関数confirm_helloworld_compiled() が用意されているのですが、これを実行するだけではつまらないので新しい関数 helloworld() を追加してみましょう。
php_helloworld.h の
PHP_FUNCTION(confirm_helloworld_compiled); /* For testing, remove later. */
の後に
PHP_FUNCTION(helloworld);
を追加します
続いて、 helloworld.c の
zend_function_entry helloworld_functions[] = {
PHP_FE(confirm_helloworld_compiled, NULL)
の後に
PHP_FE(helloworld, NULL)
を追加し、同ファイルの最後の方に
PHP_FUNCTION(helloworld)
{
printf("Hello World\n");
return;
}
を追加します。
以上で関数の追加はおしまいです。
再度 make してエラーが出なければ完成となります。
以下のような PHPプログラムを test.php というファイル名で保存します。
<?php
dl('modules/helloworld.so');
helloworld();
?>
続いて実行してみます
$ php test.php
Hello World
如何だったでしょうか、C 言語で書かれたプログラムを PHP から自然に呼び出すことが出来ました。次回は自作の関数に引数を渡したり、返値を渡す方法を見ていきます。
トラックバックURL
この記事へのトラックバック
1. links for 2006-12-27 [ Project MultiBurst ] 2006年12月28日 04:23
[N] Mac OS X用スクリーンセーバーのベスト3 (tags: Mac) iPodの診断モードに入る方法 - GIGAZINE ...
2. PHP extension からコールバックで hello, world を表示する [ ピヨピヨ ZeroMemory( ) ] 2007年03月03日 03:32
最近まわりでPHPのエクステンションを作るのがはやっているのでPHPのエンステンションを作ってみました。
実装されている関数からcallbackでPHP側で定義したユーザ関数を呼び出したいけど...
3. 日記/2007-05-23 [ PukiWiki Plus! (PukiWiki/TrackBack 0.4) ] 2007年05月23日 21:05
tag.inc.php 幅広く何でも扱うと、収集が付かなくなるのは何でも当たり前なので、タグをつけることにしたが、PukiWiki に元からあるタグ機能ではなく tag.inc.php/lsx.inc.php を利用する。クラウドも表示できるようにした(参考)。これまでつかってきたdefault.{css...
4. Hello, World! するだけの PHP Extension を作る [ Born Too Late ] 2011年01月31日 00:50
来月開催される ZendEngine勉強会@東京に向けて, 少しでも予習しておこうと思い, 以下のページを参考にやってみました. PHP Extension を作ろう第1回 – まずは Hello World DSAS開発者の部屋 しかし, この記事そのままのやり方では上手くいきませんでした. 書かれたの...
5. DSAS開発者の部屋:PHP Extension を作ろう第1回 - まずは Hello World [ ] 2012年01月16日 14:00
DSAS開発者の部屋:PHP Extension を作ろう第1回 - まずは Hello World