m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

php5.6にvldをインストールして試す

これ

PHPはどのように動くのか ~PHPコアから読み解く仕組みと定石

PHPはどのように動くのか ~PHPコアから読み解く仕組みと定石

少しずつ読んでるけどオペコードのくだりがいまいち理解できないので実際に実行して試して見る。

環境

ホスト

vagrant

OS

CentOS6.8

php

php5.6
※php7系でのvldインストールはコンパイルエラーになる

インストール

phpのためのリポジトリ
sudo rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
sudo rpm -Uvh https://mirror.webtatic.com/yum/el6/latest.rpm
phpインストール
sudo yum install  \
  php56w php56w-bcmath php56w-cli php56w-common \
  php56w-dba php56w-devel php56w-embedded php56w-enchant \
  php56w-fpm php56w-gd php56w-imap php56w-interbase php56w-intl \
  php56w-ldap php56w-mbstring php56w-mcrypt php56w-mssql php56w-mysqlnd \
  php56w-odbc php56w-opcache php56w-pdo php56w-pear php56w-pecl-apcu \
  php56w-pecl-gearman php56w-pecl-geoip php56w-pecl-imagick php56w-pecl-memcache \
  php56w-pecl-xdebug php56w-pgsql php56w-phpdbg php56w-process \
  php56w-pspell php56w-recode php56w-snmp php56w-soap php56w-tidy \
  php56w-xml php56w-xmlrpc
  
vldインストール
sudo pecl install channel://pecl.php.net/vld-0.13.0

Build process completed successfully
Installing '/usr/lib64/php/modules/vld.so'
install ok: channel://pecl.php.net/vld-0.13.0
configuration option "php_ini" is not set to php.ini location
You should add "extension=vld.so" to php.ini
php.iniにモジュールを追加
sudo vi /etc/php.ini
----
; vld
extension=vld.so
----

実行1

sample1.php
<?php
echo "hello, world";
sample1を実行
$ php -d vld.active=1 -d vld.execute=0 sample1.php
Finding entry points
Branch analysis from position: 0
Jump found. Position 1 = -2
filename:       /home/vagrant/sample1.php
function name:  (null)
number of ops:  3
compiled vars:  none
line     #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   2     0  E >   EXT_STMT
         1        ECHO                                                     'hello%2C+world'
   4     2      > RETURN                                                   1

branch: #  0; line:     2-    4; sop:     0; eop:     2; out1:  -2
path #1: 0,
$

実行2

sample2.php
<?php
$aaa = 10;
echo $aaa;

$aaa .= "ccc";
print $aaa;

$bbb = [111, 222, 333];
echo $bbb[0];
echo $bbb[1];
echo $bbb[2];
sample2を実行
$ php -d vld.active=1 -d vld.execute=0 sample2.php
Finding entry points
Branch analysis from position: 0
Jump found. Position 1 = -2
filename:       /home/vagrant/sample2.php
function name:  (null)
number of ops:  24
compiled vars:  !0 = $aaa, !1 = $bbb
line     #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   2     0  E >   EXT_STMT
         1        ASSIGN                                                   !0, 10
   3     2        EXT_STMT
         3        ECHO                                                     !0
   5     4        EXT_STMT
         5        ASSIGN_CONCAT                                 0          !0, 'ccc'
   6     6        EXT_STMT
         7        PRINT                                            ~2      !0
         8        FREE                                                     ~2
   8     9        EXT_STMT
        10        INIT_ARRAY                                       ~3      111
        11        ADD_ARRAY_ELEMENT                                ~3      222
        12        ADD_ARRAY_ELEMENT                                ~3      333
        13        ASSIGN                                                   !1, ~3
   9    14        EXT_STMT
        15        FETCH_DIM_R                                      $5      !1, 0
        16        ECHO                                                     $5
  10    17        EXT_STMT
        18        FETCH_DIM_R                                      $6      !1, 1
        19        ECHO                                                     $6
  11    20        EXT_STMT
        21        FETCH_DIM_R                                      $7      !1, 2
        22        ECHO                                                     $7
  13    23      > RETURN                                                   1

branch: #  0; line:     2-   13; sop:     0; eop:    23; out1:  -2
path #1: 0,
$

所感

そこまで厳密に理解する気はないけどあったら便利かもくらいは理解しておきたい。
最近はもうパフォーマンスが上がってきているのでそこまで気にすることはないような気もするので