当前位置: 移动技术网 > IT编程>开发语言>PHP > 深入理解PHP原理之执行周期分析

深入理解PHP原理之执行周期分析

2017年12月12日  | 移动技术网IT编程  | 我要评论

本文讲述了php原理之执行周期。分享给大家供大家参考,具体如下:

php的执行周期,从最初我们编写的php脚本->到最后脚本被执行->得到执行结果,这个过程,其实可以分为如下几个阶段:

首先,zend engine(ze),调用词法分析 器(lex生成的,源文件在 zend/zend_language_sanner.l), 将我们要执行的php源文件,去掉空格 ,注释,分割成一个一个的token。

然后,ze会将得到的token forward给语法分析 器(yacc生成, 源文件在 zend/zend_language_parser.y),生成一个一个的opcode,opcode一般会以op array的形式存在,它是php执行的中间语言。

最后,ze调用zend_executor来执行op array ,输出结果。(也就是将源文件转换成机器语言,然后在虚拟机上运行它。)

ze是一个虚拟机,正是由于它的存在,所以才能使得我们写php脚本,完全不需要考虑所在的操作系统类型是什么,这才是php的可移植性的原因。ze是一个cisc(复杂指令处理器),它支持150条指令(具体指令在 zend/zend_vm_opcodes.h),包括从最简单的zend_echo(echo)到复杂的 zend_include_or_eval(include,require),所有我们编写的php都会最终被处理为这150条指令(op code)的序列,从而最终被执行

php是一个脚本语言,也就是说,用户编写的php代码最终都是会被php解释器解释执行,所有编写的php代码,都会被翻译成php的虚拟机ze的虚拟指令(opcodes)来执行。

那我们的php脚本,最终被“翻译"成什么样的呢? 也就是说,op code长的什么样子呢? opcode是一种php脚本编译后的中间语言

在pecl中已经有这样的模块,利用由 derick rethans开发的vld (vulcan logic dissassembler)模块。你只要下载这个模块,并把他载入php中,就可以通过简单的设置,来得到脚本翻译的结果了。

vld模块的安装以及应用:

[root@localhost software]# tar zxvf vld-0.9.1.tgz.gz
[root@localhost vld-0.9.1]# /usr/local/php/bin/phpize
[root@localhost vld-0.9.1]# ./configure --with-php-config=/usr/local/php/bin/php-config
[root@localhost vld-0.9.1]# make install //不需要make

编辑php.ini文件并激活vld扩展。

实例:

创建一个文件,如:hello.php

<?php
  echo 'hello, world.';
?>

执行:

[root@localhost html]# /usr/local/php/bin/php -dvld.active=1 hello.php
branch analysis from position: 0
return found
filename:    /var/www/html/hello.php
function name: (null)
number of ops: 3
compiled vars: none
line   # op              fetch     ext return operands
-------------------------------------------------------------------------------
  2   0 echo                           'hello%2c+world.'
  4   1 return                          1
     2* zend_handle_exception
hello, world.

看另一个:

[root@localhost html]# vi vld.php
<?php
  $i = "this is a string";
  //i am comments
  echo $i. ' that has been echoed on screen';
?>

执行:

[root@localhost html]# /usr/local/php/bin/php -dvld.active=1 vld.php
branch analysis from position: 0
return found
filename:    /var/www/html/vld.php
function name: (null)
number of ops: 5
compiled vars: !0 = $i
line   # op              fetch     ext return operands
-------------------------------------------------------------------------------
  3   0 assign                          !0, 'this+is+a+string'
  7   1 concat                      ~1  !0, '+that+has+been+echoed+on+screen'
     2 echo                           ~1
 10  3 return                          1
     4* zend_handle_exception
this is a string that has been echoed on screen

注:zend_handle_exception 就是 zend/zend_vm_opcodes.h 中第149条指令

compiled vars:  !0 = $i  此处是获取变量名"i"的变量于!0(*zval)。
#0 将字符串"this+is+a+string"赋值(assign)给!0
#1 字符串连接
#2 显示

这些中间代码会被zend vm(zend虚拟机)直接执行。真正负责执行的函数是:zend_execute(zend_execute.h)。

更多关于php相关内容感兴趣的读者可查看本站专题:《php数学运算技巧总结》、《php操作office文档技巧总结(包括word,excel,access,ppt)》、《php数组(array)操作技巧大全》、《php排序算法总结》、《php常用遍历算法与技巧总结》、《php数据结构与算法教程》、《php程序设计算法总结》、《php正则表达式用法总结》、《php运算与运算符用法总结》、《php字符串(string)用法总结》及《php常见数据库操作技巧汇总

希望本文所述对大家php程序设计有所帮助。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网