hnwの日記

拡張モジュール作者だけが知っているPHPのconfigureオプション

このエントリは闇PHP Advent Calendar 2015の1日目です。ここでの「闇PHP」はPHPC言語レイヤの話題という意味で使っています。


そもそも、このAdvent Calendarは第六回闇PHP勉強会を開催する直前の変なテンションで作られたものです。25枠全部が埋まるとは思っていませんが、良いネタをお持ちの方は是非ご参加ください。

configureオプションとは

configureスクリプトと聞いてピンと来ない方がいるかもしれませんが、これはPHPをCソースコードからビルドするときの話題です。


PHPをtar ballからインストールする際、次のようにconfigureスクリプトを起動してインストール先や拡張モジュールの有効/無効などを指定してからコンパイル作業を始めます。このconfigureスクリプトに与えるコマンドラインオプションをconfigureオプションと呼んでいます。

$ tar xjf php-7.0.0RC8.tar.bz2
$ cd php-7.0.0RC8
$ ./configure --prefix=/usr/local/php-7.0.0RC8/
(略)
$ make && make install
(略)
$


どんなconfigureオプションが存在するかは./configure --helpで確認することができます。本稿では、その中からPHP拡張モジュール作者にしか役に立たないconfigureオプションを2つ紹介します。

--enable-debugオプション

最初に紹介するのは--enable-debugオプションです。これを指定すると、拡張モジュールの中でメモリの解放忘れがあった場合に、PHPデバッグメッセージの形で解放忘れを教えてくれるようになります。


拡張モジュールを開発する場合、メモリの解放忘れはやりがちな失敗です。特にPHP5ではメモリの確保・解放が煩雑なので、ミスを防ぐ意味でこのオプションのついたPHPが必須になるはずです。

--enable-maintainer-ztsオプション

次に紹介するのが--enable-maintainer-ztsオプションです。これはZTS (Zend Thread Safe) をCLI版のPHPで有効にする設定です。ZTSとNTS(Non Thread Safe)とでは拡張モジュール中のグローバル変数の取り扱いが変わるため、NTSでしか動かない拡張モジュールを作ってしまうことは珍しくありません。


ZTSはマルチスレッド環境むけの機能で、実環境でZTSになる環境はIIS環境くらいしか無いと思うのですが、ZTS環境で動く拡張モジュールを作るのはさほど面倒でもないので、普段から動作確認しておきたいところです。

全組み合わせについてCIを回す豪の者もいる

さて、これらのオプションの組み合わせということを考えると4通りのPHPを準備する必要があることになります。そんなに同じバージョンのPHPを何個も用意してられるか!と考えるのが普通のような気もしますが、pecl_httpでは全組み合わせをCIしていたりします(参照:m6w6/ext-http/.travis.yml)。


pecl_httpはPHP拡張モジュールなんですが、commitするたびにconfigureオプション違いのPHP8個(--enable-debug--enable-maintainer-zts--enable-jsonのon/offの組み合わせ)をビルドしてから拡張モジュールをテストします。拡張モジュールのテストをするのに、それよりはるかに時間のかかるPHP本体のビルドを行うという発想がすごいですね。

Travis CIにインストール済みのPHPは拡張モジュールのCIに便利

上で紹介したpecl_httpの場合は.travis.ymllanguage: cを指定してPHPをビルドしていましたが、language: phpで利用できるPHPバイナリも非常に便利です。


理由は不明ですが、Travis CIのPHP--enable-maintainer-ztsつきでビルドされています。つまり、自分でZTS版PHPを用意しなくても標準で使えるというわけです。また、バージョンも5.2から7系まで揃っているので、拡張モジュールのCI環境として非常に優れていると言えるでしょう。実際、私の作っている拡張モジュールはこれを利用して各PHPバージョンのZTS版でCIしています。

さいごに

このネタどこにも書いてなかったよなーと思っていたんですが、会社の技術ブログにかなり近い内容の記事を書いていることに気づきました。なんてこった…。


PHP Advent Calendar、明日の担当も私です!明日からは新ネタですからご安心ください!