PHP 拡張モジュール(PECL)についてのメモです。PECL の定義にについては、PEAR マニュアルの The PHP Extension Community Library (PECL) を参照してください。実際には、PECL :: The PHP Extension Community Library で配布されていますが、ここで紹介している Namazu や Chasen などのモジュールは、CVS でしか取得できないものもあります。
このページでは、モジュールのインストール方法などをメモしています。コンパイルできないなどの問題を修正するための Patch なども公開していますが、これらの Patch を適用して問題が出たとしても責任は持てませんので、Patch の使用については自己責任で行ってください。何か問題や、間違いなどがありましたら、メールで指摘をお願いします。
PHP 拡張モジュール(PECL)のメモ
最近の PECL では、pecl
コマンドを使用してインストールを行うようになりました。pecl
コマンドがないバージョンでは、おそらく pear
コマンドで動作すると思います。
pecl
で表示される APC や、SQLite などは PECL に含まれますが、PEAR と同様にインストールできます。ただ、途中でコンパイルが行われますので、開発環境が必要です。list-all
$ 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 にバイナリがありますので必要であれば、そちらからダウンロードすることができます。
Namazu をソースからインストールする場合は、全文検索システム Namazu のインストールメモを参照してください。
( 2005.05.05 追記 )
現在は Sourceforge の php-i18n に Namazu モジュールが登録され、php-namazu-2.3.1 としてダウンロードできるようになっています。
( 2005.04.03 追記 )
ライセンス問題により、Namazu モジュールは PECL から外されました([PHP-dev 1122] namazuエクステンション)。CVS からも削除される予定になっていますので、以下の方法は使用できなくなります。
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 にインストールされました。
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 のサンプルスクリプトや、関数の説明などがが入っていますので、それを参考にスクリプトを作成してください。
以下の質問メールを受けたのですが、Relay operation rejected というメールサーバからのエラーにより、返信できませんでしたので、その代わりとして、考えられる対処方法を書いておきます。
Namazuモジュールのダウンロードとインストールに挑戦し ているのですがconfigureでエラーが出てしまいます。 $ ./configure --with-namazu configure: error: Cannot find libnamazu.h. Please specify correct Namazu installation path 色々調べてみたのですがどうしたらよいのかわかりません。 よかったらアドバイスお願いします。
このエラーが出る可能性としては、以下のことが考えられます。
Namazu がインストールされていない場合
Namazu がインストールされているかどうかは、以下のコマンドを実行して、インストールされているかどうかを確認してください。
$ which namazu
または、RedHat 系の Linux を使用している場合は、rpm コマンドを利用する方法もあります。
$ rpm -qa | grep namazu
これらのコマンドを実行して、何も表示されない場合は、Namazu がインストールされていません。まず、Namazu をインストールしてください。Namazu をソースからインストールする場合は、全文検索システム Namazu のインストールメモを別で書いていますので、そちらを参照してください。また、RPM や、その他のパッケージでインストールすると簡単です。
開発用のヘッダファイルがインストールされていない場合
Namazu をソースからインストールした場合、おそらく開発用のヘッダファイルはインストールされていると思いますが、パッケージを使用した場合、開発用のヘッダファイルがインストールされていない可能性があります。
例えば、RedHat Linux などの RPM でパッケージ管理を行っている場合は以下のように開発用パッケージをインストールしてください。
$ sudo rpm -ivh namazu-devel-<バージョン>.rpm
開発用のヘッダファイルがインストールされているかどうかについては、以下のコマンドを実行して確認してください。
$ find / -name libnamazu.h
または、
$ locate libnamazu.h
で確認できると思います。おそらく、/usr/include/namazu/libnamazu.h か、/usr/local/include/namazu/libnamazu.h にインストールされていると思います。何も表示されない場合は、開発用のヘッダファイルがインストールされていません。
開発用のヘッダファイルがインストールされているのが確認できましたら、再度、PHP の Namazu モジュールの configure
を実行し、続きを行って、インストールしてください。--with-namazu
後は、make
と make install
を実行すると、Namazu モジュールがインストールされると思います。
(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 に OnUpdateInt
は OnUpdateLong
に変更したという記述を見つけましたので、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 の関数が使用できれば成功です。
随分前からですが、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
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 を適用後、以下のように、phpize
、configure
を実行した後に作成される 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++
編集後、make
、make 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)
chasen の Patch 差し替え
pecl コマンドと Windows 版の PECL についての追記と誤字・脱字の修正など。
Chasen モジュール使用時にエラーが出る場合の対処についての記述を追加、PHP5 で Namazu モジュールを作成する際に、Patch は不要になっているため、記述を追加
Namazu モジュールのライセンス問題についての記述を再度追加
Namazu モジュールのライセンス問題についての記述を追加
Namazu モジュールについてのメモを PHP4 のインストールメモから移し変えました。PHP5 で namazu モジュールを作成するための Patch、chasen モジュールの作成に失敗する問題に対する Patch などを公開しました。