準備
今回は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の最適化もちゃんと仕事してるんだなーなんてことがわかったりします。