最近発売されたPHPはどのように動くのか ~PHPコアから読み解く仕組みと定石を初心者ながらに読んでいると、PHPのオペコードをvldというパッケージを使ってダンプする、といったことをしていました。
こりゃ面白そうと思ったのでちょっとやってみました。
vldの導入
vldはpeclを使ってインストールします。
$ pecl install channel://pecl.php.net/vld-0.13.0
もしインストール出来ねー!って方はsudo
で実行してみるといいかも。
次に、php.ini
に1行追加します。
extension=vld.so
これで準備はOKです。
vldの実行
ではvldを使ってみます。
用意するPHPはこちら。
<?php
echo "Hello, PHP.";
では、このtest.php
のオペコードをダンプしてみましょう。
$ php -d vld.active=1 -d vld.execute=0 test.php
Finding entry points
Branch analysis from position: 0
Jump found. Position 1 = -2
filename: /Users/bps/test-php/test.php
function name: (null)
number of ops: 2
compiled vars: none
line #* E I O op fetch ext return operands
-------------------------------------------------------------------------------------
2 0 E > ECHO 'Hello%2C+PHP.'
3 1 > RETURN 1
branch: # 0; line: 2- 3; sop: 0; eop: 1; out1: -2
path #1: 0,
おー!出てますね!
echo
は単純に値をechoで実行するだけなので
2 0 E > ECHO 'Hello%2C+PHP.'
の1文だけで終わってますね。
では次にprint
を実行してみましょう。
<?php
print "Hello, PHP.";
$ php -d vld.active=1 -d vld.execute=0 test.php
Finding entry points
Branch analysis from position: 0
Jump found. Position 1 = -2
filename: /Users/bps/test-php/test.php
function name: (null)
number of ops: 3
compiled vars: none
line #* E I O op fetch ext return operands
-------------------------------------------------------------------------------------
2 0 E > PRINT ~0 'Hello%2C+PHP.'
1 FREE ~0
3 2 > RETURN 1
branch: # 0; line: 2- 3; sop: 0; eop: 2; out1: -2
path #1: 0,
はい出ました!さっきとは少し違うオペコードが出ましたね。
print
は戻り値を返すため、その戻り値分のメモリをFREE
で解放しているためにecho
より1文冗長的になっています。
まとめ
ということで、初心者が背伸びしてオペコードを触ってみました。
本読んで実際やってみたら「なぁーんだ、そんなことか」と今まで難しく考えていたことが馬鹿みたいに思えました。
PHPの勉強やってて「オペコードってなんだ?」って思った人は本を読んで、一度オペコードに触れてみることをオススメします。