PHP 拡張モジュール(PECL)のメモ

HOME | メモ一覧 | LastUpdate: 2006-02-04

説明と環境

PHP 拡張モジュール(PECL)についてのメモです。PECL の定義にについては、PEAR マニュアルThe PHP Extension Community Library (PECL) を参照してください。実際には、PECL :: The PHP Extension Community Library で配布されていますが、ここで紹介している Namazu や Chasen などのモジュールは、CVS でしか取得できないものもあります。

このページでは、モジュールのインストール方法などをメモしています。コンパイルできないなどの問題を修正するための Patch なども公開していますが、これらの Patch を適用して問題が出たとしても責任は持てませんので、Patch の使用については自己責任で行ってください。何か問題や、間違いなどがありましたら、メールで指摘をお願いします。


目次

PHP 拡張モジュール(PECL)のメモ

  1. 説明と環境
  2. PECL に含まれる拡張モジュールのインストール
  3. PHP のモジュールとして Namazu を組み込む
    1. Namazu モジュールのダウンロードとインストール
    2. php.ini の書き換え
    3. PHP の Namazu モジュールがインストールできない場合について
  4. PHP5 の Namazu モジュールを作成するための Patch
  5. PHP の Chasen モジュールを作成するための Patch
    1. Chasen モジュール使用時にエラーが出る場合
  6. 更新履歴

PECL に含まれる拡張モジュールのインストール

最近の PECL では、pecl コマンドを使用してインストールを行うようになりました。pecl コマンドがないバージョンでは、おそらく pear コマンドで動作すると思います。

pecl list-all で表示される APC や、SQLite などは PECL に含まれますが、PEAR と同様にインストールできます。ただ、途中でコンパイルが行われますので、開発環境が必要です。

$ pecl install SQLite

ただし、既にインストールされている PECL の拡張モジュールに対して、pear コマンドでバージョンアップを行うと、モジュールが消えてしまうようです(2004.07.30 現在の PHP 4.3.8 に含まれている pear コマンドです)。

$ pecl upgrade SQLite

upgrade オプションを使用せずに、一度アンインストールしてからインストールを行った方が良いかもしれません。

$ sudo pecl uninstall SQLite
$ sudo pear install SQLite

(2006.01.04 追記)

PECL をソースコードからダウンロードしてインストールする方法は、PHP マニュアル: PECL 拡張モジュールのインストールに詳しい説明があります。

Windows 版の PHP の PECL は PECL4WIN :: The PECL Windows Repository にバイナリがありますので必要であれば、そちらからダウンロードすることができます。

▲ 目次へ戻る


PHP のモジュールとして Namazu を組み込む

Namazu をソースからインストールする場合は、全文検索システム Namazu のインストールメモを参照してください。

( 2005.05.05 追記 )

現在は Sourceforge の php-i18n に Namazu モジュールが登録され、php-namazu-2.3.1 としてダウンロードできるようになっています。

( 2005.04.03 追記 )

ライセンス問題により、Namazu モジュールは PECL から外されました([PHP-dev 1122] namazuエクステンション)。CVS からも削除される予定になっていますので、以下の方法は使用できなくなります。

a. Namazu モジュールのダウンロードとインストール

PHP のモジュールとして、Namazu(日本語全文検索システム) を使用することができます。namazu は、ウェブサイトや、ドキュメントの検索エンジンとして使用できます。

PHP の Namazu モジュールの入手は、ftp://night.fminn.nagano.nagano.jp/php4/ から可能です。php4_namazu-2.1.0.tar.gz( 2002.08.17 時点での最新版 ) をダウンロードしてください。

2003.03.16 時点では、上記サイトには接続できないようです。以下のように、CVS を使用して、PHP の CVS リポジトリから最新版を取得するしかないようです。

$ cvs -d:pserver:cvsread@cvs.php.net:/repository login

( 2003.07.01 修正 )

ディレクトリ構成が pear/PECL/namazu からpecl/namazu に変更されているようなので、修正しました。

$ cvs -d:pserver:cvsread@cvs.php.net:/repository co pecl/namazu

と入力すると、ダウンロードが開始されます。

パスワードの入力を要求されますので、「phpfi」と入力します。

Namazu モジュールが置かれているディレクトリに移動して、コンパイル、インストールを行います。

$ cd pecl/namazu

$ phpize
$ ./configure --with-namazu
$ make
$ sudo make install

PHP 4.3.1 の環境では、/usr/local/lib/php/extensions/no-debug-non-zts-20020429/namazu.so にインストールされました。

章の最初へ | 目次へ

b. php.ini の書き換え

PHP から Namazu モジュールを使用するには、モジュールをインストールしたディレクトリを php.ini に記述する必要があります。

$ sudo vi /usr/local/lib/php.ini

Namazu 関数を頻繁に使うことは少ないと思いますので、Namazu モジュールは必要な時にのみ、使用することが多いと思います。この場合は、ソースの中で dl 関数を使用し、Namazu モジュールである、namazu.so を呼び出すことで Namazu 関数を使用可能にすることができます。

php.ini の extension_dir の設定を、以下のように namazu.so がインストールされたディレクトリを記述しておくと、 スクリプトの中でディレクトリの指定をしなくても namazu モジュールを呼び出すことが可能です。

extension_dir = /usr/local/lib/php/extensions/no-debug-non-zts-20020429

php.ini を変更した後は、Apache を再起動してください。

これで、PHP の dl() コマンドで namazu モジュールを呼び出すことができます。以下のように呼び出すと、namazu モジュールで用意されている関数が使用できるようになります。

if ( ! extension_loaded( 'namazu' ) ) {
    if ( ! dl( 'namazu.so' ) ) {
        die( 'Namazu モジュールが読み込めませんでした。' );
    }
}

もし、PHP が起動した時に、自動的に namazu モジュールを読みこむようにしたい場合は、php.ini に以下の設定を行います。namasu.so がインストールされた場所と php.ini に指定されている場所が同一かどうかを確認してください。

; namazu.so がインストールされた path を指定
extension_dir = /usr/local/lib/php/extensions/no-debug-non-zts-20020429

; 次の行を追加
extension = namazu.so

設定を行った後、Apache を再起動すれば、dl() 関数を使用しなくても namazu の関数が使用できるようになっています。

後は、Namazu モジュールのソースに、PHP のサンプルスクリプトや、関数の説明などがが入っていますので、それを参考にスクリプトを作成してください。

章の最初へ | 目次へ

c. PHP の Namazu モジュールがインストールできない場合について

以下の質問メールを受けたのですが、Relay operation rejected というメールサーバからのエラーにより、返信できませんでしたので、その代わりとして、考えられる対処方法を書いておきます。

Namazuモジュールのダウンロードとインストールに挑戦し
ているのですがconfigureでエラーが出てしまいます。

$ ./configure --with-namazu

configure: error: Cannot find libnamazu.h. Please specify correct Namazu
installation path

色々調べてみたのですがどうしたらよいのかわかりません。
よかったらアドバイスお願いします。

このエラーが出る可能性としては、以下のことが考えられます。

後は、makemake install を実行すると、Namazu モジュールがインストールされると思います。

章の最初へ | 目次へ

▲ 目次へ戻る


PHP5 の Namazu モジュールを作成するための Patch

(2005.06.04 追記)

現在の Sourceforge の php-i18n にある Namazu モジュールでは、PHP5 に対応していますので、以下の Patch は不要になりました。記述は残しておきますが、以下の Patch を適用する必要はありません。

--

PHP5 でも Namazu モジュールを使いたい場合、PHP4 の時と同様に、PHP5 でインストールされる phpize を使用してモジュール作成を行えば良いのですが、そのままでは以下のようなエラーが出てモジュールの作成に失敗するようです(今回使用した PHP のバージョンは 5.0.0 で /usr/local/php5 にインストールされています)。CVS から Namazu モジュールのソースを取得する手順については、上の Namazu モジュールのダウンロードとインストールを参照してください。

注意として、この作業を行ったのは、/usr/local に PHP4 がインストールされている環境ですので、--with-php-config で、PHP5 の環境設定を使用するように、/usr/local/php5/php-config を指定しています。PHP5 のみインストールされている環境では --with-php-config を指定する必要はないと思います。

$ cd pecl/namazu/
$ /usr/local/php5/bin/phpize
$ ./configure --with-namazu --with-php-config=/usr/local/php5/bin/php-config
$ make

...省略...

/obj/src/pecl/namazu/php_namazu.c:162: error: `OnUpdateInt' undeclared here (not in a function)
/obj/src/pecl/namazu/php_namazu.c:162: error: initializer element is not constant
/obj/src/pecl/namazu/php_namazu.c:162: error: (near initialization for `ini_entries[3].on_modify')
/obj/src/pecl/namazu/php_namazu.c:162: error: initializer element is not constant
/obj/src/pecl/namazu/php_namazu.c:162: error: (near initialization for `ini_entries[3]')
/obj/src/pecl/namazu/php_namazu.c:163: error: `OnUpdateInt' undeclared here (not in a function)
/obj/src/pecl/namazu/php_namazu.c:163: error: initializer element is not constant
/obj/src/pecl/namazu/php_namazu.c:163: error: (near initialization for `ini_entries[4].on_modify')
/obj/src/pecl/namazu/php_namazu.c:163: error: initializer element is not constant
/obj/src/pecl/namazu/php_namazu.c:163: error: (near initialization for `ini_entries[4]')
/obj/src/pecl/namazu/php_namazu.c:164: error: initializer element is not constant
/obj/src/pecl/namazu/php_namazu.c:164: error: (near initialization for `ini_entries[5]')
make: *** [php_namazu.lo] エラー 1

PHP5 の ZendEngine2 の ChangeLog に OnUpdateIntOnUpdateLong に変更したという記述を見つけましたので、PHP5 でコンパイルする際に切り替える Patch を作成しました(cvs diff で取得した差分です)。

ダウンロード用のファイルを置いておきます(php_namazu.c.patch)。

Index: php_namazu.c
===================================================================
RCS file: /repository/pecl/namazu/php_namazu.c,v
retrieving revision 1.3
diff -u -r1.3 php_namazu.c
--- php_namazu.c	15 Feb 2003 00:50:04 -0000	1.3
+++ php_namazu.c	19 Jul 2004 02:07:30 -0000
@@ -159,8 +159,13 @@
 	PHP_INI_ENTRY("namazu.sortorder", NULL, PHP_INI_ALL, OnUpdate_namazu_sortorder)
 	PHP_INI_ENTRY("namazu.sortmethod", NULL, PHP_INI_ALL, OnUpdate_namazu_sortmethod)
 	STD_PHP_INI_ENTRY("namazu.lang", NULL, PHP_INI_ALL, OnUpdateString, lang, zend_namazu_globals, namazu_globals)
+#ifdef ZEND_ENGINE_2
+	STD_PHP_INI_BOOLEAN("namazu.loggingmode", "0", PHP_INI_ALL, OnUpdateLong, loggingmode, zend_namazu_globals, namazu_globals)
+	STD_PHP_INI_BOOLEAN("namazu.debugmode", "0", PHP_INI_ALL, OnUpdateLong, debugmode, zend_namazu_globals, namazu_globals)
+#else
 	STD_PHP_INI_BOOLEAN("namazu.loggingmode", "0", PHP_INI_ALL, OnUpdateInt, loggingmode, zend_namazu_globals, namazu_globals)
 	STD_PHP_INI_BOOLEAN("namazu.debugmode", "0", PHP_INI_ALL, OnUpdateInt, debugmode, zend_namazu_globals, namazu_globals)
+#endif
 PHP_INI_END()

CVS から Namazu モジュールのソースを取得した後、以下の手順で、Patch の適用、インストールができます。ディレクトリや phpize の場所などは必要に応じて読み替えてください。

$ cd /path/to/path/pecl/namazu/
$ wget http://www.asahi-net.or.jp/%7Ewv7y-kmr/data/php_namazu.c.patch
$ patch < ./php_namazu.c.patch
$ /usr/local/php5/bin/phpize
$ ./configure --with-namazu --with-php-config=/usr/local/php5/bin/php-config
$ make
$ sudo make install

PHP5 の dl() 関数で namazu.so を呼び出して、Namazu の関数が使用できれば成功です。

▲ 目次へ戻る


PHP の Chasen モジュールを作成するための Patch

随分前からですが、PECL にある Chasen モジュールの作成が失敗するようになっています。ZTS(Zend スレッドセーフモード)への対応の際の問題のようで、ZTS が有効になっている場合はモジュールの作成に成功するようですが、通常、ZTS は無効になっていますので、モジュールの作成に失敗します。

モジュールの作成に成功するように以下の Patch を作成しました。とりあえず、動作することは確認しましたが、詳しい検証を行った訳ではありませんので、何か問題があるかもしれません。Patch 適用後は、PHP5 用としてモジュールの作成に成功することも確認しました。

ダウンロード用のファイルも置いておきます(php_chasen.c.patch)。

(2006.02.05 追記)

前の Patch では、empty_string の部分でエラーが出ていましたので、Patch を差し替えました。この Patch を適用すればコンパイルできると思います。dl() 関数使用時にエラーが出る場合は、Chasen モジュール使用時にエラーが出る場合を参考にして chasen.so に libstdc++ をリンクしてください。

Index: php_chasen.c
===================================================================
RCS file: /repository/pecl/chasen/php_chasen.c,v
retrieving revision 1.3
diff -u -r1.3 php_chasen.c
--- php_chasen.c	10 Aug 2003 12:45:11 -0000	1.3
+++ php_chasen.c	22 Jan 2006 16:06:56 -0000
@@ -121,11 +121,14 @@
 		argv[2] = NULL;
 		break;
 	}
-
+#ifdef ZTS
 	tsrm_mutex_lock(php_chasen_mtx);
+#endif
 
 	if (chasen_getopt_argv(argv, NULL) != 0) {
+#ifdef ZTS
 		tsrm_mutex_unlock(php_chasen_mtx);
+#endif
 		if (argv) {
 			efree(argv);
 		}
@@ -138,9 +141,11 @@
 	if (res) {
 		RETVAL_STRING(res, 1);
 	} else {
-		RETVAL_STRINGL(empty_string, 0, 1);
+		RETVAL_STRINGL("", 0, 1);
 	}
+#ifdef ZTS
 	tsrm_mutex_unlock(php_chasen_mtx);
+#endif
 
 	if (argv) {
 		efree(argv);
@@ -163,11 +168,15 @@
 
 	convert_to_string_ex(arg_str);
 
+#ifdef ZTS
 	tsrm_mutex_lock(php_chasen_mtx);
+#endif
 
 	if (chasen_getopt_argv(php_chasen_argv_wakati, NULL) != 0) {
 		php_error(E_WARNING,"unable to initialize chasen library");
+#ifdef ZTS
 		tsrm_mutex_unlock(php_chasen_mtx);
+#endif
 		RETURN_FALSE;
 	}
 	res = chasen_sparse_tostr(Z_STRVAL_PP(arg_str));
@@ -191,7 +200,9 @@
 	} else {
 		RETVAL_FALSE;
 	}
+#ifdef ZTS
 	tsrm_mutex_unlock(php_chasen_mtx);
+#endif
 }
 /* }}} */

Namazu モジュールと同様に、Chasen モジュールのソースを取得した後、以下の手順で、Patch の適用、インストールができます。CVS にログインする際のパスワードは 「phpfi」です。

$ cvs -d:pserver:cvsread@cvs.php.net:/repository login
$ cvs -d:pserver:cvsread@cvs.php.net:/repository co pecl/chasen
$ cd pecl/chasen/
$ wget http://www.asahi-net.or.jp/%7Ewv7y-kmr/data/php_chasen.c.patch
$ patch < ./php_chasen.c.patch
$ /usr/local/bin/phpize
$ ./configure --with-chasen
$ make
$ sudo make install

使い方については、pecl/chasen/README.ja に以下のように書かれています。

・関数
  string chasen(string string, array option)
    chasen コマンド
      string : 処理対象の文字列
      opsion : オプション
    例:
      $str = chasen($str, array("-F%m "));

      $str = chasen($str, array("-F%y"));


  array chasen_split(string string)
    chasen により分かち書きを行い結果を配列にする
      string : 処理対象の文字列
    例:
      $str = "日本語の文字列";
      $ary = chasen_split($str);

後は、dl() 関数で chasen.soを読み込んで関数が使用できるかどうかを確認します。CLI 版の PHP で試したところ、以下のようになりました。

$ php -r 'dl( "chasen.so" ); echo chasen( "テストです。", "" );'
テスト  テスト  テスト  名詞-サ変接続
です    デス    です    助動詞  特殊・デス      基本形
。      。      。      記号-句点
EOS

a. Chasen モジュール使用時にエラーが出る場合

PHPWalker の管理者のムトウさんから Chasen モジュールのコンパイルが成功しても、モジュール読み込み時にエラーが出るという指摘を受け、原因を調べてみました。ムトウさんのサイトでこの問題に関する解説や、PHP5 で Chasen モジュールをコンパイルする方法について、詳しく説明しておられますので、コンパイル手順などは PHPWalker >> PHP5でchasenを使うの方が参考になると思います。

ただし、こちらの環境では確認できなかったのですが、libstdc++ のバージョンによってはエラーになるという問題があるようです。また、Namazu モジュールと同様に、ライセンスの問題の影響を受ける可能性がありますので、バイナリの再配布については特に注意する必要があります。

最近のバージョン Chasen を使用している場合、コンパイルは成功しても、Chasen モジュールの読み込み時に、エラーになる場合があります。dl() 関数で chasen.so を呼び出すと以下のようなエラーが出力され、Chasen モジュールが使えません。

PHP Warning:  dl(): Unable to load dynamic library '/usr/local/lib/php/extensions/no-debug-non-zts-20020429/chasen.so'
- /usr/lib/libchasen.so.0: undefined symbol: _ZNSs4_Rep11_S_terminalE in Command line code on line 1

原因は、Chasen モジュールをコンパイルした時に作成される chasen.so に必要なライブラリがリンクされていないことのようです。

対処方法としては、上記の php_chasen.c に対する Patch を適用後、以下のように、phpizeconfigure を実行した後に作成される Makefile の共有ライブラリの指定に -lstdc++ を追加してください。

$ phpize
$ ./configure --with-chasen

を実行後、作成される Makefile を編集します。

CHASEN_SHARED_LIBADD = -Wl,-rpath,/usr/lib -lchasen -L/usr/lib -lchasen

この後ろに -lstdc++ を追加してください。

CHASEN_SHARED_LIBADD = -Wl,-rpath,/usr/lib -lchasen -L/usr/lib -lchasen -lstdc++

編集後、makemake install を行います。その後、php.ini で PHP の起動時に読み込むか、または、dl() 関数によるモジュール読み込みで chasen.so の読み込み時にエラーが表示されなければ大丈夫です。

確認するには、以下のように、ldd コマンドで、libstdc++.so がリンクされているかどうかを調べます。以下は、PHP 4.3.11 で、Chasen モジュールを作成した時の例です。何も表示されない場合はコンパイルに失敗している可能性が高いと思われます。

$ ldd /usr/local/lib/php/extensions/no-debug-non-zts-20020429/chasen.so | grep libstdc++
   libstdc++.so.5 => /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.5-20050130/libstdc++.so.5 (0xb7e29000)

章の最初へ | 目次へ

▲ 目次へ戻る


更新履歴

( 2006-02-05 )

chasen の Patch 差し替え

( 2006-01-04 )

pecl コマンドと Windows 版の PECL についての追記と誤字・脱字の修正など。

( 2005-06-04 )

Chasen モジュール使用時にエラーが出る場合の対処についての記述を追加、PHP5 で Namazu モジュールを作成する際に、Patch は不要になっているため、記述を追加

( 2005-05-05 )

Namazu モジュールのライセンス問題についての記述を再度追加

( 2005-04-03 )

Namazu モジュールのライセンス問題についての記述を追加

( 2004-07-30 )

Namazu モジュールについてのメモを PHP4 のインストールメモから移し変えました。PHP5 で namazu モジュールを作成するための Patch、chasen モジュールの作成に失敗する問題に対する Patch などを公開しました。

▲ 目次へ戻る

LastUpdate: 2006-02-04 | メモ一覧 | HOME