LoginSignup
5
3

More than 5 years have passed since last update.

phpdbgでコンパイル後のopcode列を確認する方法

Last updated at Posted at 2016-11-27

 準備

今回はPHP 7.0.0で実装されたphpdbgの-pオプションを使ってopcode列を表示してみます。筆者はPHP 7.0.13で実験しました。

もしphp.iniでxdebugを読み込んでいたら外してください(余計なopcodeが付くのを防ぐため)。

opcode列の表示

まずopcode列を表示したいPHPプログラムを用意します。

foo.php
<?php
foo(8);
function foo($i) {
    $i++;
    var_dump($i**3);
}

次にコマンドラインから次のように実行。

$ phpdbg -p'*' foo.php

すると下記のようにopcode列が表示されます。

function name: (null)
L1-7 {main}() /private/tmp/foo.php - 0x110c6c0a0 + 5 ops
 L2    #0     INIT_FCALL_BY_NAME                           "foo"
 L2    #1     SEND_VAL_EX             8                    1
 L2    #2     DO_FCALL
 L3    #3     NOP
 L7    #4     RETURN                  1

function name: foo
L3-6 foo() /private/tmp/foo.php - 0x110c65600 + 8 ops
 L3    #0     RECV                    1                                         $i
 L4    #1     POST_INC                $i                                        ~0
 L4    #2     FREE                    ~0
 L5    #3     INIT_FCALL              112                  "var_dump"
 L5    #4     POW                     $i                   3                    ~1
 L5    #5     SEND_VAL                ~1                   1
 L5    #6     DO_ICALL
 L6    #7     RETURN                  null
[Script ended normally]

また、下記のようにすればOPcache適用後のopcode列を確認することもできます。

$ phpdbg -dopcache.enable_cli=1 -p'*' foo.php
function name: (null)
L1-7 {main}() /private/tmp/foo.php - 0x10d507ca0 + 4 ops
 L2    #0     INIT_FCALL              128                  "foo"
 L2    #1     SEND_VAL                8                    1
 L2    #2     DO_FCALL
 L7    #3     RETURN                  1

function name: foo
L3-6 foo() /private/tmp/foo.php - 0x10d507b70 + 7 ops
 L3    #0     RECV                    1                                         $i
 L4    #1     PRE_INC                 $i
 L5    #2     INIT_FCALL              112                  "var_dump"
 L5    #3     POW                     $i                   3                    ~0
 L5    #4     SEND_VAL                ~0                   1
 L5    #5     DO_ICALL
 L6    #6     RETURN                  null
[Script ended normally]

PHP 7以降でPHP本体がかなり最適化をするようになったとはいえ、OPcacheの最適化もちゃんと仕事してるんだなーなんてことがわかったりします。

5
3
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
5
3