LoginSignup
13
14

More than 5 years have passed since last update.

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

Posted at

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

13
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
14