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


Posted in PHP onJune 01, 2016

本文讲述了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的宝库目录--PEAR
Oct 09 PHP
PHP学习 变量使用总结
Mar 24 PHP
PHP输出时间差函数代码
Jan 28 PHP
PHP生成短网址的3种方法代码实例
Jul 08 PHP
完美解决thinkphp验证码出错无法显示的方法
Dec 09 PHP
两种php去除二维数组的重复项方法
Nov 04 PHP
Yii2分页的使用及其扩展方法详解
May 23 PHP
php gd等比例缩放压缩图片函数
Jun 12 PHP
php字符串操作针对负值的判断分析
Jul 28 PHP
PHP中串行化用法示例
Nov 16 PHP
PHP数组内存利用率低和弱类型详细解读
Aug 10 PHP
PHP基于redis计数器类定义与用法示例
Feb 08 PHP
深入理解PHP之OpCode原理详解
Jun 01 #PHP
深入理解PHP中的count函数
May 31 #PHP
Ubuntu server 11.04安装memcache及php使用memcache来存储session的方法
May 31 #PHP
php中json_encode不兼容JSON_UNESCAPED_UNICODE的解决方案
May 31 #PHP
让你的PHP7更快之Hugepage用法分析
May 31 #PHP
PHP表单数据写入MySQL数据库的代码
May 31 #PHP
PHP将页面中点击数量高的链接进行高亮显示的方法
May 30 #PHP
You might like
微信公众平台天气预报功能开发
2014/07/06 PHP
PHP+jQuery 注册模块的改进(三):更新到Smarty3.1
2014/10/14 PHP
php实现singleton()单例模式实例
2014/11/06 PHP
PHP date_default_timezone_set()设置时区操作实例分析
2020/05/16 PHP
jquery的$(document).ready()和onload的加载顺序
2010/05/26 Javascript
jquery form表单提交插件asp.net后台中文解码
2010/06/12 Javascript
nodejs 后缀名判断限制代码
2011/03/31 NodeJs
jQuery点击后一组图片左右滑动的实现代码
2012/08/16 Javascript
js 加密压缩出现bug解决方案
2014/11/25 Javascript
详解原生JavaScript实现jQuery中AJAX处理的方法
2016/05/10 Javascript
JavaScript获取URL中参数querystring的方法详解
2016/10/11 Javascript
jQuery实现用户信息表格的添加和删除功能
2017/09/12 jQuery
NodeJs通过async/await处理异步的方法
2017/10/09 NodeJs
js中的深浅拷贝问题简析
2019/05/10 Javascript
Vue列表循环从指定下标开始的多种解决方案
2020/04/08 Javascript
vue实现一个获取按键展示快捷键效果的Input组件
2021/01/13 Vue.js
Python中遍历字典过程中更改元素导致异常的解决方法
2016/05/12 Python
python方向键控制上下左右代码
2018/01/20 Python
Django中Forms的使用代码解析
2018/02/10 Python
Django项目中model的数据处理以及页面交互方法
2018/05/30 Python
python之列表推导式的用法
2019/11/29 Python
Python字符编码转码之GBK,UTF8互转
2020/02/09 Python
Django视图、传参和forms验证操作
2020/07/15 Python
Python 创建守护进程的示例
2020/09/29 Python
浅析CSS3中鲜为人知的属性:-webkit-tap-highlight-color
2017/01/12 HTML / CSS
波兰品牌鞋履在线商店:Eastend.pl
2020/01/11 全球购物
大专计算机个人求职的自我评价
2013/10/21 职场文书
小学运动会表扬稿
2014/01/19 职场文书
公司会计岗位职责
2014/02/13 职场文书
秋游活动策划方案
2014/02/16 职场文书
化学专业毕业生求职信
2014/07/28 职场文书
商场父亲节活动方案
2014/08/27 职场文书
个人查摆剖析材料
2014/10/04 职场文书
新学期红领巾广播稿
2014/10/04 职场文书
社区法制宣传日活动总结
2015/05/05 职场文书
Win10 最新稳定版本 21H2开始推送
2022/04/19 数码科技