深入理解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+AJAX实现无刷新注册(带用户名实时检测)
Dec 02 PHP
ajax php 实现写入数据库
Sep 02 PHP
基于PHP array数组的教程详解
Jun 05 PHP
解析thinkphp基本配置 convention.php
Jun 18 PHP
PHP遍历某个目录下的所有文件和子文件夹的实现代码
Jun 28 PHP
使用Curl进行抓取远程内容时url中文编码问题示例探讨
Oct 29 PHP
ThinkPHP框架设计及扩展详解
Nov 25 PHP
php生成shtml类用法实例
Dec 09 PHP
PHP在线打包下载功能示例
Oct 15 PHP
利用php生成验证码
Feb 23 PHP
PHP hebrev()函数用法讲解
Feb 21 PHP
分享8个Laravel模型时间戳使用技巧小结
Feb 12 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获取linux服务器状态的代码
2014/05/27 PHP
简单谈谈favicon
2015/06/10 PHP
微信公众平台开发(五) 天气预报功能开发
2016/12/03 PHP
php获取文件名称和扩展名的方法
2017/02/07 PHP
jQuery学习3:操作元素属性和特性
2010/02/07 Javascript
用Jquery实现多级下拉框无刷新的联动
2010/12/22 Javascript
js实现的简单radio背景颜色选择器代码
2015/08/18 Javascript
jQuery实现垂直半透明手风琴特效代码分享
2015/08/21 Javascript
在 Express 中使用模板引擎
2015/12/10 Javascript
JavaScript中实现无缝滚动、分享到侧边栏实例代码
2016/04/06 Javascript
简单总结JavaScript中的String字符串类型
2016/05/26 Javascript
实例解析Array和String方法
2016/12/14 Javascript
Vue.js实现表格动态增加删除的方法(附源码下载)
2017/01/20 Javascript
jquery 校验中国身份证号码实例详解
2017/04/11 jQuery
从对象列表中获取一个对象的方法,依据关键字和值
2017/09/20 Javascript
浅谈 Vue 项目优化的方法
2017/12/16 Javascript
基于Vue2x的图片预览插件的示例代码
2018/05/14 Javascript
浅谈Angular单元测试总结
2019/03/22 Javascript
如何为你的JavaScript代码日志着色详解
2019/04/08 Javascript
通过实例解析JavaScript常用排序算法
2020/09/02 Javascript
详解JavaScript之Array.reduce源码解读
2020/11/01 Javascript
[03:09]2014DOTA2国际邀请赛 Mushi前队友送上祝福
2014/07/12 DOTA
pycharm 使用心得(二)设置字体大小
2014/06/05 Python
python修改FTP服务器上的文件名
2019/09/11 Python
Python中断多重循环的思路总结
2019/10/04 Python
Python如何设置指定窗口为前台活动窗口
2020/08/12 Python
加拿大最大的钻石商店:Peoples Jewellers
2018/01/01 全球购物
酒店工作职员求职简历的自我评价
2013/10/23 职场文书
技术股东合作协议书
2014/12/02 职场文书
就业意向书范本
2015/05/11 职场文书
标准发言稿结尾
2019/07/18 职场文书
导游词之秦始皇兵马俑博物馆
2019/09/29 职场文书
海贼王十大潜力果实,路飞仅排第十,第一可毁世界(震震果实)
2022/03/18 日漫
SpringCloud项目如何解决log4j2漏洞
2022/04/10 Java/Android
Golang数据类型和相互转换
2022/04/12 Golang
tomcat默认最大连接数及相关调整方法
2022/05/06 Servers