2006年10月26日

PHP Extension を作ろう第1回 - まずは Hello World

はてなブックマークに登録

PHP で汎用的なライブラリを作成するフレームワークには大きく分けて2種類あるようです。
ひとつは PEAR のように PHP でクラスライブラリを作る方法、もう一つが今回紹介する PECL の様に PHP 自体を拡張するモジュールを書く方法です。

  • なぜ PHP Extension ?


  • ひとつは、過去に 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 から自然に呼び出すことが出来ました。次回は自作の関数に引数を渡したり、返値を渡す方法を見ていきます。

    klab_gijutsu2 at 21:33│Comments(0)TrackBack(5)開発 

    トラックバック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開発者の部屋 しかし, この記事そのままのやり方では上手くいきませんでした. 書かれたの...
    DSAS開発者の部屋:PHP Extension を作ろう第1回 - まずは Hello World

    この記事にコメントする

    名前:
    URL:
      情報を記憶: 評価: 顔   
     
     
     
    Blog内検索
    Archives
    このブログについて
    DSASとは、KLab が構築し運用しているコンテンツサービス用のLinuxベースのインフラです。現在5ヶ所のデータセンタにて構築し、運用していますが、我々はDSASをより使いやすく、より安全に、そしてより省力で運用できることを目指して、日々改良に勤しんでいます。
    このブログでは、そんな DSAS で使っている技術の紹介や、実験してみた結果の報告、トラブルに巻き込まれた時の経験談など、広く深く、色々な話題を織りまぜて紹介していきたいと思います。
    最新コメント