PHP extension 写経 - 準備編 -
TOP > てきとうにこらむ > ゲーム作りとプログラミング日記 > PHP extension 写経 - 準備編 -
もくじ
このstudy_extensionはGitHubにおいてます: https://github.com/youkidearitai/study_extension
PHPを理解したい
php-srcの一部でも理解したいと思ったとき、さらなる深堀りをするにはどうしたらよいか。
プログラミングを理解するとき、人は写経を行う。php-srcもプログラムである。php-srcを理解するには写経がよいのではないか。
この関数ならばzval構造体の使い方がわかるのではないか、ということで写経をしてみようと思い立った。
下準備
php-srcのソースは、GitHubからgit cloneで取得するのが良い。php-srcは毎日と言っていいほど何らかの変更が加えられているので、その差分だけを取得すると、ソースの動向を追いやすい。
すべてをgit cloneで取得するのは大変だ、ということであれば、何らかの方法使って取得を限定するとよいと思うけど、例えばこのブロックの挙動がわからないときにgit blameやgit logで参照できると良いので、すべて取得している。
php-srcのコードを写経するとしたら何が良いだろうと思ったけれども、php-srcを直接手を入れたくないので、extensionを作るのが良いだろう。写経をするのだから、ハマったときに写経の元のソースがそのまま閲覧できるのでよいと思う。
作成する環境について
手元の環境は次のようにする。
- extensionの名前はstudy_extensionとする
- WSL上のUbuntuにコンパイルに必要なものをapt installする
- PHP-7.4ブランチ
- コンパイルしたPHPは$HOME/php74に格納する
その結果、コンパイルオプションは次のようになるはず。
$ cat config.nice
#! /bin/sh
#
# Created by configure
'./configure' \
'--enable-debug' \
'--with-pear' \
'--enable-mbstring' \
'--enable-intl' \
'--prefix=/home/tekimen/php74' \
'--with-openssl' \
'--with-zlib' \
"$@"
デバッグがしたいので--enable-debugオプションを追加する。
また、make installした先を、$HOME/php74 とするので--prefix=$HOME/php74、展開されて私の環境では--prefix=/home/tekimen/php74となっている。
これは最終的には--enable-study_extensionが入るけど、まだ次の工程でPHPが必要なので、ひとまずはなしで。
これをconfigure、make、make installすれば、/home/tekimen/php74にphpのコマンド群が入る。
では、それをどのようにして使うのかというと、direnvを使った。 php-srcのあるディレクトリに.envrcを入れておけば、カレントディレクトリがphp-srcのあるディレクトリ以下になったときに自動的にPATHを入れてくれる。
$ cat .envrc
PATH=$HOME"/php74/bin":$PATH
これでmake installしたphpコマンドを扱えるはず。
$ php -v
PHP 7.4.6-dev (cli) (built: Apr 25 2020 17:04:51) ( NTS DEBUG )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
extensionをext_skel.phpで作成
php-srcを何らかの方法で取得し、コンパイルしてインストールできたら、次からはextensionを作る。extディレクトリに移動して、ext_skel.phpをphpコマンドで実行する。
$ cd ext/
$ php ext_skel.php --ext study_extension
すると、study_extensionディレクトリができているので、ビルドすることができるようになっている。
これでphp-srcのディレクトリに戻ってきて、--enable-study_extensionを加えればビルドができる。なので、ビルドをし直す。
$ cat config.nice
#! /bin/sh
#
# Created by configure
'./configure' \
'--enable-debug' \
'--enable-study_extension' \
'--with-pear' \
'--enable-mbstring' \
'--enable-intl' \
'--prefix=/home/tekimen/php74' \
'--with-openssl' \
'--with-zlib' \
"$@"
このオプションでconfigure、make、make installとして正常にコンパイルできればOK。
テストケース
makeを行った後、make testコマンドでphp-srcのテストを行うことができる。extensionに限定してビルドすることもできる。
$ make test TESTS=ext/study_extension
こうすると、study_extensionのtestsディレクトリにあるテストが実行される。
成功するとよいが、失敗する場合には、4種類のファイルが生成される。
- .diff expとoutとの違い
- .exp expected
- .log これらをあわせて見やすくしたもの
- .out actual、出力した結果
テストに失敗したときには、これらを照らし合わせて修正していくということになる。
編集するファイルは
編集するファイルは、{extension_name}.{c,h}となる。つまり、今回の場合はstudy_extension.cとstudy_extension.hである。これらを編集していくことになる。
今回はこれで終了、次からはvar_dumpを実装していけたらいいなと思う。