[PHP]pecl,phpize,extensionという単語を見て頭痛がするあなたへの処方箋
はじめに
PHP Extension, pecl, phpize, php-config, *.so
これらの単語を見て頭が頭痛になったことはありませんか? pecl installがコケてm9(^Д^)プギャーってなったことはありませんか? 私はあります。
しかしPHPの環境構築をしようと思ったら、PHP Extensionは避けては通れないテーマです。 ひとつひとつの仕組みの裏側を理解すれば怖いことはありませんので、いちど根っこから掘り下げて勉強しておきましょう。
2つに分断されたPHPの世界
PHPの世界では、ライブラリ配布方式が2つの世界に分断されてしまっています。
ライブラリの種類 | 配布サイト | インストーラ |
---|---|---|
PHP言語で書かれたライブラリ | Packagist (https://packagist.org/) | Composer |
C言語で書かれたライブラリ | PECL (https://pecl.php.net/) | pecl |
後者の「C言語で書かれたライブラリ」のことを「エクステンション」といいます。実体は拡張子.soファイルです。 php.iniの末尾に"extension=memcached.so"とか書くときのアレです。
余談ですが、世の中的に Packagist/Composerまわりは話題も豊富で解説記事も多くありますが、extension/peclまわりはちゃんと解説しているサイトが少ないです。 PECL公式サイトの仕様書 (https://pecl.php.net/doc/index.php) にいきなり"SVN Branches"がどうのとか書いてあるし、ちょっと初心者を寄せ付けない感じありますね…
そもそもpeclとは何か?
PECL公式サイトによると、
What is PECL?
PECL is a repository for PHP Extensions, providing a directory of all known extensions and hosting facilities for downloading and development of PHP extensions. The packaging and distribution system used by PECL is shared with its sister, PEAR.
[意訳] PECLとは何か?
PECLはPHPエクステンションのためのレポジトリです。PECLはエクステンションの一欄を提供し、エクステンションを開発したりダウンロードしたりする場所を提供します。 PECLのパッケージングと配布システムはPEARと共通のものが使われています。
だそうです。
- え、PECLってコマンドだと思ってたけど、そうじゃなくてレポジトリのことだったの?
- え、PEARってオワコンって聞いてたけど、違うの?
公式サイトの説明だけだとわかりにくいのですが、実体を鑑みると、
「PECLとはPHPエクステンションを配布するWebサイトの名前であり、パッケージングシステムの名前であり、コマンドの名前でもある」
と理解するのがよいでしょう。
PEARはオワコンって聞いたけど?
「PHPアプリケーションから呼び出すライブラリ」という意味では、確かにPEAR方式のライブラリはもうほとんど使われていません。
しかしあなたがpeclコマンドを使うとき、裏側でPEAR.phpが動いています。
実際、あなたのシステムにあるPEAR.phpを削除するとpeclコマンドが動かなくまります。
# 良い子はマネしないで!
$ sudo rm /usr/share/pear/PEAR.php
$ pecl help
Warning: require_once(PEAR.php): failed to open stream: No such file or directory in pearcmd.php on line 50
PHP Warning: require_once(PEAR.php): failed to open stream: No such file or directory in /usr/share/pear/pearcmd.php on line 50
Warning: require_once(PEAR.php): failed to open stream: No such file or directory in /usr/share/pear/pearcmd.php on line 50
PHP Fatal error: require_once(): Failed opening required 'PEAR.php' (include_path='/usr/share/pear') in /usr/share/pear/pearcmd.php on line 50
Fatal error: require_once(): Failed opening required 'PEAR.php' (include_path='/usr/share/pear') in /usr/share/pear/pearcmd.php on line 50
これはpeclコマンドが内部的にpearcmd.php
というファイルを呼び出していて、pearcmd.php
がPEAR.php
に依存しているからです。
なので、
- peclコマンドは内部的にPEARライブラリを使っている
- PECLのパッケージ配布の仕組みはPEARのそれとほぼ同じものである。
ということになります。
pecl installは何をやっているのか?
pecl installの目的を一言で言うと、「*.soファイルを生成して所定の場所(extension_dir)に置くこと」です。
(extension_dirがどこかわからない場合はphp -i | grep -i extension_dir
で調べられます。)
pecl install hoge
したとき、大まかには次のようなことが行われています。
- パッケージのソースコード一式(tar.gz)をダウンロード
- tar.gzを解凍
- ビルド
- 生成されたhoge.soファイルをextension_dirにコピー
上記手順はもちろんひとつづつ手動でやることもできます。 逆に、手動でビルドするならpeclコマンドは不要です。
「手動ビルド」の手法を身につけておくと役に立つことがある
どういうときかというと、例えば
- あるエクションテンションを使いたい
- pecl installしたらエラーが出てビルドできなかった
- Github上ではそのエクステンションが修正されているのに、まだPECLレポジトリでは提供されていない
みたいなときです。 実際、現時点でPHP7用のmemcachedエクステンションがそんな感じです。
エクステンションを手動でビルドしてみる
例として、PHP7用のmemcachedエクステンションをビルドする方法を紹介します。 手動ビルドなのでpeclコマンドは使いません。
前提条件として、
- CentOS7
- PHP7を手動ビルドしてインストール済み
- memcachedエクステンションのソースが https://github.com/php-memcached-dev/php-memcached にある
とします。
# エクステンションが依存するライブラリを入れておく
$ sudo yum install libmemcached-devel
# エクステンションのソースコードを取得
$ git clone -b php7 --depth 1 https://github.com/php-memcached-dev/php-memcached
# ビルド
$ cd php-memcached
$ phpize
$ ./configure
$ make
$ sudo make install
解説
まず最初のyum install libmemcached-devel
ですが、これはエクステンションmemcachedが別のC言語製ライブラリ(libmemcached)に依存しているので、それをインストールしています。
次に git clone でmemcachedエクステンションのソースコードを取得しています。 ソースコードの置き場所をどうやって知るのかというと、PECLサイトのmemcachedのページ (https://pecl.php.net/package/memcached) にて、“Browse Source” というリンクがあるのでそれで知ります。
つぎにphpize
というコマンドを叩いています。
これはconfigure
スクリプトを生成するツールであると理解しておけばよいです。
あとは、普通のC言語製ソフトウェアをビルド・インストールするのと同じ手順です。
最後のsudo make install
が何をしているのかというと、生成された./modules/memcached.so をextension_dirにコピーしてるだけです。
システム内に複数のPHPがあるとき
同じホスト内に複数のバージョンのPHPがあるとき、上記方法だとどっちのextension_dirに入るのか?問題が出てきます。
その場合は、configureするときに下記のようにphp-configコマンドを指定してあげればよいです。
$ phpize
$ ./configure --with-php-config=/path/to/bin/php-config
$ make
$ sudo make install
まとめ
- PHPにおけるextension,soファイル, pecl, phpize, php-configの関係について解説しました。
- 便利コマンドに頼らず一度は自力でビルドしてみるといいよ。
- あなたがWebエンジニアでも、makeまわりの知識はあったほうがいいよ。
余談:Composerで全部やってくれないの?
ComposerでPHP Extensionをインストールする試みもあるそうですが、まだまだ先は長そうです。