タイトルからPHP7を使ったウェブアプリケーションの開発環境についてだと思いました?
紛らわしくて申し訳ないです。この記事はPHP7本体のソースコードをいじって遊んでみた時の開発環境の構築手順です。
PHP7のコンパイル、ビルド、ソースコードの変更とテストなど、言語としてのPHP7に手を加える際の説明になります。※この記事は2017年11月19日に書かれたものです。
環境情報
OS: Ubuntu16.04
gcc: version 5.4.0
GNU: Make 4.1
git: version 2.7.4
もし上記がインストールされていないようでしたら事前にインストールして下さい。エディタにはAtomを使いました。
phpのプロジェクトをgithubから取得
githubにあるプロジェクトをcloneします。これは公式プロジェクトのミラーリングです。
$ git clone https://github.com/php/php-src.git
ローカルでビルド出来るようにします。cloneしたプロジェクト直下にある README.UNIX-BUILD-SYSTEM を見ると普通にmakefile
でビルドできるようです。
まずbuildconf
ファイルを動かすためにautoconfをインストールします。
makeファイルの生成
$ sudo apt install autoconf
そしてbuildconf
を実行します。
$ ./buildconf
これでconfigure
が作られたので実行します。
$ ./configure
configure: error: bison is required to build PHP/Zend when building a GIT checkout!
んん?bisonが必要だとエラーになりました。そんな感じで必要なモジュールを入れていきます。libxml2
も必要でした。
$ sudo apt install bison libxml2-dev
configureに成功して必要なファイルが作られました。
ほんとに動作するか確かめる
コンパイルとテストが通るか確認します。
$ make test
んん?多くは成功しているようですが、なんか失敗しているテストがあります。
FAILED TEST SUMMARY
---------------------------------------------------------------------
bool dns_get_mx ( string $hostname , array &$mxhosts [, array &$weight ] ); [ext/standard/tests/network/dns_get_mx.phpt]
せっかくなので、このエラーをいじってみましょうか。
phpのバージョン確認
sapi/cli
以下にあるphp
実行ファイルのバージョンを表示させてみます。
$ ./sapi/cli/php --version
7.3.0の開発版でした。たくさんエラーが残っていそうですね。
PHP 7.3.0-dev (cli) (built: Nov 19 2017 17:47:46) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.3.0-dev, Copyright (c) 1998-2017 Zend Technologies
テストケースの修正と再実行
話を戻して、ext/standard/tests/network/dns_get_mx.phpt
のテストケース実行に失敗しています。
これはphptファイルなので直接実行して見ます。make test
の後ろに対象のphptファイルを指定するとピンポイントでテストを実行できます。
make test TESTS=ext/standard/tests/network/dns_get_mx.phpt
うーん、これだけだと差分が出力されないので原因が分かりませんでした。差分を表示してみましょうか。
make test TESTS='--show-diff ext/standard/tests/network/dns_get_mx.phpt' TEST_PHP_DETAILED=1
--show-diff
を付けると無事にエラー個所を特定できました。
========DIFF========
003- Hosts: %i, weights: %i
3行目の出力が正しくありません、という事はdns_get_mx.phpt
で指定されている3つ目のドメインwiki.php.net
のgetmxrr
関数を呼び出した結果がfalseになっていますね。
getmxrrの説明を見ると「何も見つからないかエラーが発生した場合に FALSE を返します。」とあるのでwiki.php.net
のレコードをdig
して見ます。
$ dig wiki.php.net mx
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;wiki.php.net. IN MX
MXレコードが空でした。これはテストケースが古いままのように見えますね。という事で自分の環境ではコメントアウトしておきます。これで再実行するとエラーにならなくなりました。
さて他にエラーがないか確認するために、ext/standard
以下をまとめて実行してみましょうか。
$ make test TESTS=ext/standard
他のエラーが出てきてしまいました、うーん、開発中バージョンなので細かい事は気にしない事にします。
ソースコードの編集と再度ビルド
dns_get_mx.phpt
でテストしているgetmxrr
にbasic_function.c
で定義されています。実装はdns.c
にあります。
Makefile
を使って標準的なビルドが行われているので、普通にコードを変更すれば差分コンパイルが実行されます。
例えばdns.c
をエディタで上書きして再度テストmake test TESTS='ext/standard/tests/network/dns_get_mx.phpt'
を実行すると変更差分がコンパイルされテストが実行されます。
ここはMakefile
の挙動なのでphp特有な点はありませんね。
まとめ
思いのほかすんなりと開発環境を構築できて動作なども問題なく試せました。
プルリクエストの取り込みやデプロイフローについて等のルール、本家wikiのドキュメントも充実していて、今のPHP言語は開発体制が整っているなあと印象です。
参考情報
http://www.phpinternalsbook.com/php7/build_system/building_php.html
https://wiki.php.net/