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!