Edit
PHP Extentionとは?

PHPの関数として、外部のライブラリをPHPに組み込む事で、開発の効率を高めたり動作速度を向上させたりする機能を指す。主にPEAR PECLといった実装方法があり、それぞれ特徴があるが、このページではC言語との連動を重要視するため、PECL方式のみの説明となる。

Edit
PECL(PHP Extension Community Library)とは?

PECLで提供されるライブラリはCで記述されているため、PHPで記述されたPEARのライブラリよりも高速に動作する。PECLにより提供されるライブラリはPHPの拡張モジュールとしてインストールされる。一方で、PEARライブラリはPHPのバージョンアップに伴う再インストールが原則として不要なのに対し、PECL拡張モジュールはPHP内部のAPIに依存する部分があるため、PHPのバージョンアップに伴いAPIが変更された場合は再コンパイルを必要とする。Wikipedia

Edit
基本的な開発の流れ

当然ながら、クラス要素及び独自の内部システムで稼働するPHPと、C言語のようなプリミティブな言語を連携させるには、多くのオブラート関数が必要となる。そこで開発の効率化を意識し、PEAR::CodeGen_PECLという、スケルトン生成ツールを利用してみたい。

Edit
基本環境のインストール

C言語のコンパイル環境のインストール

# yum groupinstall "Development Tools"

PHP環境のインストール

# yum install php php-devel php-pear
# pear install --alldeps CodeGen_PECL

Edit
PEAR::CodeGen_PECLによるスケルトン作成

まず最初に、xml ファイルを作ることが重要であり、これによってスケルトンの骨組みを設定する。下記では最低限のサンプルを紹介する。

「myExtention.xml」

<?xml version="1.0" ?>
<extension name="myExtention" version="1.0.0">
 <summary>My PHP extension</summary>
 <function name="myFunc">
  <proto>string myFunc()</proto>
  <code>
   RETURN_STRING("OK", 1);
  </code>
  <test>
   <code>
    echo myFunc();
   </code>
  </test>
 </function>
</extension>

上記のコードは、myExtention というExtentionを作成し、myFuncという関数が定義されていることを示す。<test>項目はテスト時に利用するコードとなる。
ファイルを保存後、ジェネレーターを起動し、ソースを作成する。

# pecl-gen -f myExtention.xml

これによって、myExtentionというフォルダがカレントフォルダに作成され、中にソースコード一式が作成される。

Edit
コンパイルとインストール

上記のxmlで作成した、ソースコードをコンパイルする。

# cd myExtention
# phpize
# ./configure --enable-myExtention
# make
# make install
# echo "extension=myExtention.so" >> /etc/php.ini

Edit
apacheの再起動

# service httpd restart

Edit
確認コードの設置

上記のインストールで、PHPに自分のmyExtentionが追加されているがそれを確認するために、自分のapacheのDocumentフォルダにPHPの情報ページを作成。

# vi /var/www/html/phpinfo.php
 <?php
   phpinfo();
 ?>

また自分のextentionの関数の結果を表示させることも可能

# vi /var/www/html/myExtention.php
 <?php
   myFunc();
 ?>

上記の結果、該当ページにそれぞれの情報が表示され、結果を確認できる。

Edit
xmlに記述される代表的なディレクティブ

Edit
Extentionの環境に関する定義

タグ意味
<extention name="myExtention" version="0.9.0"></extention>この定義の中がextentionの定義本体となる。TOPレベルの定義
<summary>my PHP extension</summary>簡単な1行によるExtentionの説明文
<description>より詳細な説明</description>より詳細な説明文
<group></group>これで囲った範囲をグループとしてあつかう
<maintainers></maintainers>メンテナンス担当者に関する情報を記述
<release></release>リリースの日付やバージョンなどの情報を記述
<changelog></changelog>変更点に関する情報を記述
<channel></channel>公開先のサーバのチャネル情報を記述
<license></license>公開ライセンスの種別を選択、PHP or BSD or LGPL のみ
<logo></logo>このExtentionのロゴを設定する場合に利用
<deps language="cpp" platform="linux"></deps>言語や環境に関する依存情報(特に利用ライブラリなど)の指定のために利用される。但しcppの指定は極力しないこと。またこのセクションの中で利用できるのは、<with>、<lib> 、<header>の3つ

Edit
関数定義の為の定義

タグ意味
<function name="myFunc"></function>関数のトップレベル定義
<proto>String myFunc(string param)</proto>関数のプロトタイプ宣言。戻り値のあとに、関数名を定義。カッコの中には、引数を定義する。

Edit
代表的なPECL:JSONエンコーダーライブラリ

PECLを利用したライブラリで有名なのは、JSONエンコーダ/デコーダだろう。ここでは実際にこのJSONライブラリを、PHPに登録するまでを説明する。

Edit
コンパイル

先にコンパイル環境をインストールしておく、これ以外にももちろんCのコンパイル環境も必要となる。

# yum install php-devel php-pear

これで、PECLコマンドが利用できる。

# pecl install json

完了すると /usr/lib/php/modules/json.so が作成されている。

Edit
読み込み設定

作成された、so ファイルを、PHPに読み込ませるため以下のファイルを作成する。

# vi /etc/php.d/json.ini
 extension=json.so

このファイルによって、PHP起動時にjson_decodeなどが使える。apacheからPHPを起動する場合はapacheの再起動を忘れないように。

Edit
トラブルシューティング

  1. PHP本体がよく複数存在するため、コンパイル時のPHPと違ったものを参照しようとしてエラーになる。
    1. PHPが複数存在しないか確認し、不要な物は消すかパスから外す。
  2. php.ini内で、extention=myExtention.so を指定しないと、extentionを利用できない。但し、指定なしでもソース中でダイナミックにロードさせることで利用可能になる。
    例:dl("myExtention.so");