てきとうなさいと べぇたばん

2016年のPHPで知ったこと・わかったこと。そして2017年へ

PHP Advent Calendar 2016

こんにちは。メリークリスマス。普段は大宮でPHPerしてます、てきめんです。明日になったら年末一直線ですね。

この記事はPHP Advent Calendar 2016の25日目の記事です。

今年何したか

PHPで今年何をしたのか、というと。ざっと並べてみましょう。

  • 1年ぶりに仕事した。PHPありがとう。
  • PHP7がリリースされたのでなんとかして実行できないかと思ってDockerに全部閉じ込めた
    • いろいろ問題があったが、いろいろなバージョンを俯瞰して見られたのは良かったかも
  • PHPのマイナーバージョンアップでは意外とアグレッシブな変更がある
    • PHP7.1では後方互換性を無視しはじめて正しい実装へ向かっている。という個人的な感想
    • ユーザーランドではPHP5とPHP7はあまり変わりはないが、PHP7.1とPHP7.0は個人的には別物と思う
  • php-srcを読み進めていって、字句解析・構文解析のより一層の理解と、とVM(opcode)のほんのちょっとの理解が得られた

DockerでPHP7を無理やり動かしたおかげで、各方面からツッコミを頂戴しつつ、それでも調べたいバージョンを調べる事ができるのは手軽な気がしました。

Dockerに閉じ込めた

Apache httpdやbuild-essentialから何から何まで突っ込んでおいて、Dockerコンテナでビルドさせるという相当メチャクチャなことをしています。アホの極みです。そんなことしてるからディスクの容量が逼迫するとかいう副作用が半端ないです。ヒエー

こんな感じ。

$ sudo docker images
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
youkidearitai/php71-tmcmaker   latest              ad1749c0f1cc        4 weeks ago         909.6 MB
youkidearitai/php7-tmcmaker    latest              782cfc193d9e        4 weeks ago         895.4 MB
youkidearitai/php7-tmcmaker    build               501d3d25ecd7        5 months ago        553.6 MB

まだPHP7.1じゃなくてPHP7.1RC6だけど…

$ sudo docker run youkidearitai/php71-tmcmaker php -v
PHP 7.1.0RC6 (cli) (built: Nov 20 2016 17:34:05) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.1.0-dev, Copyright (c) 1998-2016 Zend Technologies

こっちはPHP7、まだ7.0.13じゃねーか

$ sudo docker run youkidearitai/php7-tmcmaker php -v
PHP 7.0.13 (cli) (built: Nov 20 2016 01:42:02) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies

ただし、メリットもありました。PHPの各バージョンをそれぞれ違いを見るためにDockerのリポジトリを書き換えればいいというところです。それぞれの挙動を確認して、実装ではこうなっているというのを調査するのは、そこだけ便利でした。そこだけですので、実運用には勧められないとだけ言っておきます。

てか、これdocker tagじゃね?とか今思ったので、年末年始に作り直そうかなあ…

マイナーバージョンアップでもアグレッシブである

今年、結構話題になったmt_randの「壊れているが、確実に動いている」というあのバグありましたが、さすがにPHP7.1へ移されました。とはいえ、PHPはマイナーバージョンアップのChangelogをみるだけでも結構面白いです。

特に、#71275は結構面白いバグだったなあと。Trait周りは結構バグが多い印象があって、ちょっと…という感じになってしまうのが個人的につらいところ。

後方互換製のない変更にまとまってPHP7.1が集約されている

特に、先程述べた「mt_rand」の件はPHP7.1で取り込まれました。更に、「空文字列に文字列のオフセット」を指定したとき、文字列ではなく「配列」になってしまうがこれは間違いだったという話は衝撃でした。

はじめてopcodeでのブレークポイントを設定しました。至難の業でした。引っ掛けましたが。

個人的な感想としてはPHP7.1はPHP5系からPHP7.0へのアップグレードよりも難しいかもしれません。データ型を意識した、またはセキュアなコードを心がけるべきなのでしょう。

php-srcがどのくらい読めるようになったのか

  • opcodeのブレークポイントを設定したのははじめてでした。これによってPHPの実行に対する内部構造の理解が一段と進んだ気がします。
  • ASTはまだ読み切れていません。抽象構文木があることで、色々なメリットが有ることは知っていますが、まだその部分が理解できていないと感じます。
  • re2cとbisonによる字句解析・構文解析部分はなんだかんだ結構読んでるような気がします。リテラルで指定する-2の63乗では結構たいへんでした。
  • ビルトイン関数のマニュアルにない挙動を調べるのにphp-srcを読んだほうが早かったりするときがあるとか…

何故かPython 3.6のCPython実装を読んでしまって、2.7のソースを読んでない…

PHP5.6、ついに

ついにPHP5.6のアクティブサポートが2016年いっぱいをもって終了になります。これをもって、アグレッシブな変更が無くなる…ではなく、PHP5系の新たな機能追加が行われなくなることを意味することになるのですね。

ぼくもそうですが、まだまだPHP5系は使われているところがたくさんあるので、セキュリティリリースではまだまだ現役だとおもいますが、新規ではもうPHP7.0、できれば7.1を使うべきなのでしょう。(その前にPHPであるべきかどうかもとかいったら本末転倒か)

アドベントカレンダー、気軽に書こうと思う

何故か最近、「書かなきゃいけない」っていう感じを個人的に感じてしまっていたので、どんなんでも個人的には楽しみですし、楽しく、時にはおお、役に立つなと思って読んでいます。

それでは、良いお年を。