PHP
vld

初心者PHPerがオペコードをvldを使って覗いてみた

More than 3 years have passed since last update.

最近発売されたPHPはどのように動くのか ~PHPコアから読み解く仕組みと定石を初心者ながらに読んでいると、PHPのオペコードをvldというパッケージを使ってダンプする、といったことをしていました。

こりゃ面白そうと思ったのでちょっとやってみました。


vldの導入

vldはpeclを使ってインストールします。

$ pecl install channel://pecl.php.net/vld-0.13.0

もしインストール出来ねー!って方はsudoで実行してみるといいかも。

次に、php.iniに1行追加します。


php.ini

extension=vld.so


これで準備はOKです。


vldの実行

ではvldを使ってみます。

用意するPHPはこちら。


test.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を実行してみましょう。


test.php

<?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の勉強やってて「オペコードってなんだ?」って思った人は本を読んで、一度オペコードに触れてみることをオススメします。