読者です 読者をやめる 読者になる 読者になる

GoTheDistance

ござ先輩と言われています。(株) クオリティスタートという会社をやっています。

【書評】PHPはどのように動くのか〜PHPコアから読み解く仕組みと定石〜

技術評論社の傅様よりご恵贈頂きました。いつもありがとうございます。

PHPの文法の解説ではなく、PHP4以降のコアとなっているZend Engineの解説書です。技術評論社でしか世に出せない一冊ではないでしょうか。

PHPコアとは何か

PHPは御存知の通り、インタプリタ型の言語です。PHPスクリプトを字句解析→構文解析を行い、「オペコード(opcode)」にコンパイルして、PHPの実行エンジン(Zend Engine)に食わせて実行します。このオペコードがどのように生成され、実行されているのか。割り当てた変数や関数のメモリはどう管理されているかを実行エンジンレベルで読み解いていくことで、PHPで書いたスクリプトの意味を見直そうというのが本書の趣旨です。目の付け所が濃ゆいですね。

オペコードのパフォーマンス

本書の第2章「オペコードのパフォーマンスを考える」が最も個人的に面白かったです。PHPスクリプトのパフォーマンスはオペコードで決まる、と。自分の書いたPHPスクリプトがこう評価されて実行されるのかと。演算子ひとつとっても、変換されるオペコードが違うのだなぁ...と。気をつけようって思いました。

著者とは違う方の資料ですが、この資料もオペコードを知るのに大変参考になりました。PHP5.5系から組み込まれたオペコードの最適化及びキャッシュを行う「OPcache」の解説です。

www.slideshare.net

コピーオンライト

PHPの実行エンジンの仕組みとして、コピーオンライトというものがあります。PHP5系では、全ての変数の型がコピーオンライトで管理されます。ある変数を代入して参照する時は同じメモリ領域を参照するだけで、コピー後の変数を書き換えた時に新たにメモリ領域を確保するという仕組みです。

<?php
$foo = 'foo';
$bar = $foo; //同じメモリ領域を指す
$bar = 'bar'; //新規にメモリ領域を割当

メモリ領域を節約できるので良さそうなのですが、PHP7系ではコピーオンライトを行う変数の型が制限されました。それ故にパフォーマンスの向上が見込めると本書にはあります。なかなか面白い話ですので、続きは本書をあたって下さい。

C言語の知識があると望ましい

Zend EngineがC言語で実装されていますので、C言語の知識があるとより本書の言わんとしてることが見えてくると思います。僕はほとんど知らないので、基礎文法ぐらいは抑えておこうかなって思いました...

PHPを書くなら目を通しておこう

オペコードを見て「へーそうなんだ」ぐらいの解釈でも全然OKだと思います。オペコードなるものに変換され実行される仕組みを全く知らないのは、PHPを書くのならもったいない。基礎知識として持っておくべきです。ざっと目を通しておくだけでも、何かしら知らなかったPHPの知見を得られることでしょう。

面白かったです!