最小化安装php7
cd ~/software/
git clone https://github.com/php/php-src.git
cd php-src
git checkout php-7.2.13
cd ../
cp -r php-src php7.2
cd php7.2
./buildconf --force
./configure --prefix={家目录}/software/temp/php7 --disable-all
make && make install
核心模块:Core date ereg pcre Reflection SPL standard
较php5多出一个ereg模块,且bin目录下多了phpdbg可执行文件
安装vld
git clone https://github.com/derickr/vld.git
cd vld
~/software/temp/php7/bin/phpize
./configure --with-php-config={家目录}/software/temp/php7/bin/php-config --enable-vld
make && make install
cd ~/software/temp/php7/lib
touch php.ini
echo 'extension=vld.so' > php.ini
~/software/temp/php7/bin/php -m | grep vld 如果在输出的结果能看到vld,则说明vld扩展启用成功。
测试vld生成opcode
cd ~/software/temp/php7
mkdir test
cd test
touch vld.php
输入如下代码:
<?php
$str = 'hello world';
var_dump($str);
执行如下命令查看上述php代码的opcode:
~/software/temp/php7/bin/php -dvld.active=1 vld.php
执行结果如下:
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename: /home/leon/software/temp/php7/test/vld.php
function name: (null)
number of ops: 5
compiled vars: !0 = $str
line #* E I O op fetch ext return operands
-------------------------------------------------------------------------------------
2 0 E > ASSIGN !0, 'hello+world'
3 1 INIT_FCALL 'var_dump'
2 SEND_VAR !0
3 DO_ICALL
4 4 > RETURN 1
branch: # 0; line: 2- 4; sop: 0; eop: 4; out0: -2
path #1: 0,
string(11) "hello world"
图形化调用结果
安装dot
sudo apt-get install graphviz
~/software/temp/php7/bin/php -dvld.active=1 -dvld.save_paths=1 vld.php
dot -Tpng /tmp/paths.dot -o paths.png
结果如下:
测试token_get_all
需要先安装tokenizer扩展,安装步骤同vld安装步骤
<?php
$tokens = token_get_all('<?php echo; ?>');
foreach ($tokens as $token) {
if (is_array($token)) {
echo "Line {$token[2]}: ", token_name($token[0]), " ('{$token[1]}')", PHP_EOL;
}
}
?>
php执行后结果为:
Line 1: T_OPEN_TAG ('<?php ')
Line 1: T_ECHO ('echo')
Line 1: T_WHITESPACE (' ')
Line 1: T_CLOSE_TAG ('?>')