DELAEMON BLOG

Live as if you were to die tomorrow. Learn as if you were to live forever.

PHP Extensionの作り方 その1 基本編

仕事でPHPを使っているのに拡張が書けないなんてカッコ悪い、ということで書き方。

extに移動してスケルトンを作成

$ cd php-src/ext/
$ ./ext_skel --extname=delaemon

生成されたディレクトリへ移動

$ cd delaemon/

コメントを外す
$ vim config.m4

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

追加する関数を記述
$ vim php_delaemon.h

PHP_FUNCTION(confirm_delaemon_compiled);>-/* For testing, remove later. */
+ PHP_FUNCTION(delaemon);

$ vim delaemon.c

const zend_function_entry delaemon_functions[] = {
  PHP_FE(confirm_delaemon_compiled, NULL)  /* For testing, remove later. */
+  PHP_FE(delaemon, NULL)

実装を追記

PHP_FUNCTION(delaemon)
{
      printf("Delaemon!\n");
          return;
}

コンパイル

$ phpize
$ ./configure
$ make

テストするため、拡張ファイルをdl()で読み込む。
セキュリティ上よろしくないということで
デフォルト設定がOffになったそうです

読み込んでいるphpの設定ファイルを確認

$ php -i | grep "Configuration File"
Configuration File (php.ini) Path => /etc
Loaded Configuration File => /etc/php.ini

存在しなかったのでコピーして置く
$ sudo cp /etc/php.ini.default /etc/php.ini

設定を変更。dl()を有効にする
$ sudo vim /etc/php.ini

enable_dl = On

作った拡張のファイルを配置
読み込まれる拡張ディレクトリを確認

$ php -i | grep "extension_dir"
extension_dir => /usr/lib/php/extensions/no-debug-non-zts-20090626 => /usr/lib/php/extensions/no-debug-non-zts-20090626

シンボリックリンク張っておく

$ sudo ln -s /Users/dela/Documents/develop/Study/php/php-src/ext/delaemon/modules/delaemon.so /usr/lib/php/extensions/no-debug-non-zts-20090626/

対話モードでテスト

$ php -a
Interactive shell

php > dl('delaemon.so');
php > delaemon();
Delaemon!