欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-04-02 13:52:28
本文讲述了php原理之执行周期。分享给大家供大家参考,具体如下: php的执行周期,从最初我们编写的php脚本->到最后脚本被执行->得到执行结果,这个过程,...

本文讲述了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程序设计有所帮助。