深入理解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 相关文章推荐
excellent!――ASCII Art(由目标图象生成ascii)
Feb 20 PHP
PHP项目开发中最常用的自定义函数整理
Dec 02 PHP
php5.3中连接sqlserver2000的两种方法(com与ODBC)
Dec 29 PHP
PHP提交表单失败后如何保留已经填写的信息
Jun 20 PHP
服务器上配置PHP运行环境教程
Feb 12 PHP
php实现复制移动文件的方法
Jul 29 PHP
php通过排列组合实现1到9数字相加都等于20的方法
Aug 03 PHP
老生常谈文本文件和二进制文件的区别
Feb 27 PHP
php数据序列化测试实例详解
Aug 12 PHP
PHP实现的链式队列结构示例
Sep 15 PHP
PHP 加密 Password Hashing API基础知识点
Mar 02 PHP
通过代码实例解析PHP session工作原理
Dec 11 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
php UTF8 文件的签名问题
2009/10/30 PHP
php实现获取及设置用户访问页面语言类
2014/09/24 PHP
PHP在线书签系统分享
2016/01/04 PHP
THinkPHP获取客户端IP与IP地址查询的方法
2016/11/14 PHP
B/S开发中常用javaScript技术与代码
2007/03/09 Javascript
iphone safari不支持position fixed的解决方法
2012/05/04 Javascript
js自定义方法通过隐藏iframe实现文件下载
2013/02/21 Javascript
JavaScript实现的使用键盘控制人物走动实例
2014/08/27 Javascript
jQuery对指定元素中指定字符串进行替换的方法
2015/03/17 Javascript
javascript中Array()数组函数详解
2015/08/23 Javascript
JavaScript中使用sencha gridpanel 编辑单元格、改变单元格颜色
2015/11/26 Javascript
微信小程序 Storage API实例详解
2016/10/02 Javascript
详解微信小程序开发之下拉刷新 上拉加载
2016/11/24 Javascript
jQuery编写网页版2048小游戏
2017/01/06 Javascript
Vue项目中使用better-scroll实现一个轮播图自动播放功能
2018/12/03 Javascript
基于Vue的商品主图放大镜方案详解
2019/09/19 Javascript
Layui tree 下拉菜单树的实例代码
2019/09/21 Javascript
vue样式穿透 ::v-deep的具体使用
2020/06/04 Javascript
Python3处理文件中每个词的方法
2015/05/22 Python
玩转python爬虫之cookie使用方法
2016/02/17 Python
python数据清洗系列之字符串处理详解
2017/02/12 Python
遗传算法python版
2018/03/19 Python
tensorflow1.0学习之模型的保存与恢复(Saver)
2018/04/23 Python
python 统计列表中不同元素的数量方法
2018/06/29 Python
使用Python 正则匹配两个特定字符之间的字符方法
2018/12/24 Python
pyinstaller打包成无控制台程序时运行出错(与popen冲突的解决方法)
2020/04/15 Python
详解Python调用系统命令的六种方法
2021/01/28 Python
详解HTML5中的拖放事件(Drag 和 drop)
2016/11/14 HTML / CSS
html5开发三八女王节表白神器
2018/03/07 HTML / CSS
HTML5基于flash实现播放RTMP协议视频的示例代码
2020/12/04 HTML / CSS
C#的几个面试问题
2016/05/22 面试题
房务中心文员岗位职责
2014/04/16 职场文书
产品质量保证书范本
2015/02/27 职场文书
2015年学校精神文明工作总结
2015/05/27 职场文书
信用卡工作证明范本
2015/06/19 职场文书
2016三八妇女节慰问信
2015/11/30 职场文书