PHP
PHPDay 6

PHP7言語の開発環境を構築する

More than 1 year has passed since last update.

タイトルから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.netgetmxrr関数を呼び出した結果が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でテストしているgetmxrrbasic_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/