1. 首先进行词法分析,将源代码切割为多个字符串单元(token)
借助token_get_all函数获取代码切割后的token
<?php
var_dump(token_get_all("<?php echo \"hello world\";"));
打印结果:
array(5) {
[0]=>
array(3) {
[0]=>
int(379)
[1]=>
string(6) "<?php "
[2]=>
int(1)
}
[1]=>
array(3) {
[0]=>
int(328)
[1]=>
string(4) "echo"
[2]=>
int(1)
}
[2]=>
array(3) {
[0]=>
int(382)
[1]=>
string(1) " "
[2]=>
int(1)
}
[3]=>
array(3) {
[0]=>
int(323)
[1]=>
string(13) ""hello world""
[2]=>
int(1)
}
[4]=>
string(1) ";"
}
数组中的子数组第一个值为token对应的枚举值,第二个值是原始的字符串,第三个值是代码的行号
2. 进行语法分析,将token转为抽象语法树(AST)
AST是php7新特性
3. 抽象语法树转换为机器指令(opcode)执行
opcode在虚拟机中执行,指令都对应这相应的处理函数,当虚拟机调用opcode时,会找到相应的处理函数,执行处理
php的优化 开启opcache,指的是opcodes的缓存,省去源码到opcode的过程,虚拟机可以直接执行缓存的opcode,来提高性能