Help us understand the problem. What is going on with this article?

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした