深入理解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 相关文章推荐
phpmyadmin的#1251问题
Nov 25 PHP
php去除重复字的实现代码
Sep 16 PHP
解析PHP计算页面执行时间的实现代码
Jun 18 PHP
thinkphp3查询mssql数据库乱码解决方法分享
Feb 11 PHP
PHP中使用CURL模拟登录并获取数据实例
Jul 01 PHP
php中unserialize返回false的解决方法
Sep 22 PHP
php实现mysql事务处理的方法
Dec 25 PHP
php mysql like 实现多关键词搜索的方法
Oct 29 PHP
PHP实现的数独求解问题示例
Apr 18 PHP
PHP实现的Redis多库选择功能单例类
Jul 27 PHP
PHP实现压缩图片尺寸并转为jpg格式的方法示例
May 10 PHP
详细分析PHP 命名空间(namespace)
Jun 30 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
骨王战斗力在公会成员中排不进前五,却当选了会长,原因竟是这样
2020/03/02 日漫
php实现的RSS生成类实例
2015/04/23 PHP
[原创]PHP简单开启curl的方法(测试可行)
2016/01/11 PHP
解决PHP 7编译安装错误:cannot stat ‘phar.phar’: No such file or directory
2017/02/25 PHP
Yii框架实现多数据库配置和操作的方法
2017/05/25 PHP
PHP通过文件路径获取文件名的实例代码
2018/10/14 PHP
JQuery CSS样式控制 学习笔记
2009/07/23 Javascript
jQuery中:eq()选择器用法实例
2014/12/29 Javascript
Node.js的文件权限及读写flag详解
2016/10/11 Javascript
Vue 2.x教程之基础API
2017/03/06 Javascript
jQuery设置图片等比例缩小的方法
2017/04/29 jQuery
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(一)
2017/05/11 Javascript
React-Native之定时器Timer的实现代码
2017/10/04 Javascript
js实现控制文件拖拽并获取拖拽内容功能
2018/02/17 Javascript
vue+mousemove实现鼠标拖动功能(拖动过快失效问题解决方法)
2018/08/24 Javascript
vue 解决addRoutes多次添加路由重复的操作
2020/08/04 Javascript
在Python的web框架中编写创建日志的程序的教程
2015/04/30 Python
python迭代器与生成器详解
2016/03/10 Python
Python引用类型和值类型的区别与使用解析
2017/10/17 Python
Python多线程编程之多线程加锁操作示例
2018/09/06 Python
Python3.6+Django2.0以上 xadmin站点的配置和使用教程图解
2019/06/04 Python
python opencv 读取图片 返回图片某像素点的b,g,r值的实现方法
2019/07/03 Python
TENSORFLOW变量作用域(VARIABLE SCOPE)
2020/01/10 Python
Python 列表推导式需要注意的地方
2020/10/23 Python
捷克汽车配件和工具销售网站:TorriaCars
2018/02/26 全球购物
湖南卫视在线视频媒体平台:芒果TV
2019/10/30 全球购物
英国百年闻名的优质健康产品连锁店:Holland & Barrett
2019/12/19 全球购物
人力资源专员自我评价怎么写
2013/09/19 职场文书
乡镇交通安全实施方案
2014/03/29 职场文书
大一新生学期自我评价
2014/04/09 职场文书
企业安全生产演讲稿
2014/05/09 职场文书
房屋出租委托书格式
2014/09/23 职场文书
政风行风评议个人心得体会
2014/10/29 职场文书
入团介绍人意见范文
2015/06/04 职场文书
2016小学新学期寄语
2015/12/04 职场文书
使用python绘制横竖条形图
2022/04/21 Python