SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

PHPエクステンションの作り方

PHPエクステンションでHelloWorld

PHPエクステンションの作り方 第1回


  • X ポスト
  • このエントリーをはてなブックマークに追加

 本記事では数回にわたって、PHPのエクステンションを作成する方法を紹介していきます。簡単な関数の作成を通じて、PHPのエクステンションの作り方に触れていきます。今回はエクステンションを作る際の全体的な流れと共に、作成のための準備やコンパイルの方法などを説明します。

  • X ポスト
  • このエントリーをはてなブックマークに追加

はじめに

 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行目の以下の部分のコメント部分を削除するだけです。

config.m4ファイルの抜粋(dnlコメント削除前)
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の部分がコメントになります。この部分を削除した結果は以下のとおりです。

config.m4ファイルの抜粋(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
PHP_ARG_ENABLE([モジュール名],[configure時に出力するコメント],[configure --helpの時に出力するコメント])

 より詳しく知りたい方は、PHP:UNIX用のビルドシステム:config.m4を参照ください。

 これで一通りの準備がそろいました。

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
ビルドする

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
PHPエクステンションの作り方連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 小林 昌弘(コバヤシ マサヒロ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/7246 2013/08/27 18:34

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング