深入理解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 相关文章推荐
shopex中集成的站长统计功能的代码简单分析
Aug 11 PHP
php中explode与split的区别介绍
Oct 03 PHP
PHP表单递交控件名称含有点号(.)会被转化为下划线(_)的处理方法
Jan 06 PHP
php中把美国时间转为北京时间的自定义函数分享
Jul 28 PHP
php中字符查找函数strpos、strrchr与strpbrk用法
Nov 18 PHP
PHP输入输出流学习笔记
May 12 PHP
PHP抓取远程图片(含不带后缀的)教程详解
Oct 21 PHP
利用PHPStorm如何开发Laravel应用详解
Aug 30 PHP
在云虚拟主机部署thinkphp5项目的步骤详解
Dec 21 PHP
Thinkphp5行为使用方法汇总
Dec 21 PHP
Laravel核心解读之异常处理的实践过程
Feb 24 PHP
Yii redis集合的基本使用教程
Jun 14 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
什么是OneThink oneThink后台添加插件步骤
2016/04/13 PHP
PHP全功能无变形图片裁剪操作类与用法示例
2017/01/10 PHP
PHP实现的pdo连接数据库并插入数据功能简单示例
2019/03/30 PHP
Laravel 集成微信用户登录和绑定的实现
2019/12/27 PHP
javascript 常用代码技巧大收集
2009/02/25 Javascript
javascript学习笔记(十二) RegExp类型介绍
2012/06/20 Javascript
java、javascript实现附件下载示例
2014/08/14 Javascript
jQuery动画出现连续触发、滞后反复执行的解决方法
2015/01/28 Javascript
JavaScript基于setTimeout实现计数的方法
2015/05/08 Javascript
javascript实现日期时间动态显示示例代码
2015/09/08 Javascript
uploadify多文件上传参数设置技巧
2015/11/16 Javascript
jQuery过滤特殊字符及JS字符串转为数字
2016/05/26 Javascript
JavaScript接口的实现三种方式(推荐)
2016/06/14 Javascript
jquery计算出left和top,让一个div水平垂直居中的简单实例
2016/07/13 Javascript
实例解析Array和String方法
2016/12/14 Javascript
微信小程序实现轮播图效果
2017/09/07 Javascript
Django中使用jquery的ajax进行数据交互的实例代码
2017/10/15 jQuery
javascript 中模板方法单例的实现方法
2017/10/17 Javascript
浅谈vue项目可以从哪些方面进行优化
2018/05/05 Javascript
使用element-ui的el-menu导航选中后刷新页面保持当前选中状态
2019/07/19 Javascript
python局域网ip扫描示例分享
2014/04/03 Python
编写Python脚本来实现最简单的FTP下载的教程
2015/05/04 Python
使用Python编写基于DHT协议的BT资源爬虫
2016/03/19 Python
Python在图片中插入大量文字并且自动换行
2019/01/02 Python
深入解析Python小白学习【操作列表】
2019/03/23 Python
python中的句柄操作的方法示例
2019/06/20 Python
Pytorch 搭建分类回归神经网络并用GPU进行加速的例子
2020/01/09 Python
Python 读取有公式cell的结果内容实例方法
2020/02/17 Python
python操作toml文件的示例代码
2020/11/27 Python
html5 canvas绘制放射性渐变色效果
2018/01/04 HTML / CSS
英国老牌潮鞋店:Offspring
2019/08/19 全球购物
服装行业创业计划书范文
2014/02/05 职场文书
工伤事故赔偿协议书范文
2014/09/24 职场文书
亮剑观后感300字
2015/06/05 职场文书
飞屋环游记观后感
2015/06/08 职场文书
对讲机知识
2022/04/07 无线电