深入理解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 和 XML: 使用expat函数(二)
Oct 09 PHP
php UBB 解析实现代码
Nov 27 PHP
PHP中将字符串转化为整数(int) intval() printf() 性能测试
Mar 20 PHP
ajax php传递和接收变量实现思路及代码
Dec 19 PHP
PHP实现的封装验证码类详解
Jun 18 PHP
php获取数组长度的方法(有实例)
Oct 27 PHP
php中smarty实现多模版网站的方法
Jun 11 PHP
WordPress用户登录框密码的隐藏与部分显示技巧
Dec 31 PHP
php生成mysql的数据字典
Jul 07 PHP
Yii的Srbac插件用法详解
Jul 14 PHP
Ajax实现对静态页面的文章访问统计功能示例
Oct 10 PHP
PHP中模糊查询并关联三个select框
Jun 19 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
全国FM电台频率大全 - 9 上海市
2020/03/11 无线电
图书管理程序(一)
2006/10/09 PHP
利用PHP生成CSV文件简单示例
2016/12/21 PHP
PHP jpgraph库的配置及生成统计图表:折线图、柱状图、饼状图
2017/05/15 PHP
关于this和self的使用说明
2010/08/01 Javascript
js获取指定日期前后的日期代码
2013/08/20 Javascript
JQuery中模拟image的ajaxPrefilter与ajaxTransport处理
2015/06/19 Javascript
jquery实现动静态条形统计图
2015/08/17 Javascript
js小数运算出现多位小数如何解决
2015/10/08 Javascript
分享几种比较简单实用的JavaScript tabel切换
2015/12/31 Javascript
基于JavaScript实现智能右键菜单
2016/03/02 Javascript
精彩的Bootstrap案例分享 重点在注释!(选项卡、栅格布局)
2016/07/01 Javascript
JavaScript中的call和apply的用途以及区别
2017/01/11 Javascript
bootstrapValidator.min.js表单验证插件
2017/02/09 Javascript
js实现音频控制进度条功能
2017/04/01 Javascript
jquery Ajax实现Select动态添加数据
2017/06/08 jQuery
VueJs监听window.resize方法示例
2018/01/17 Javascript
浅谈webpack-dev-server的配置和使用
2018/05/17 Javascript
解决vue中axios设置超时(超过5分钟)没反应的问题
2020/09/04 Javascript
vue祖孙组件之间的数据传递案例
2020/12/07 Vue.js
Python中的包和模块实例
2014/11/22 Python
深入理解Javascript中的this关键字
2015/03/27 Python
Python脚本实时处理log文件的方法
2016/11/21 Python
windows下python连接oracle数据库
2017/06/07 Python
Python中int()函数的用法浅析
2017/10/17 Python
python中subprocess批量执行linux命令
2018/04/27 Python
Tensorflow模型实现预测或识别单张图片
2019/07/19 Python
Python实现线性判别分析(LDA)的MATLAB方式
2019/12/09 Python
keras的ImageDataGenerator和flow()的用法说明
2020/07/03 Python
写给保洁员表扬信
2014/01/08 职场文书
小学数学教研活动总结
2014/07/01 职场文书
合同和协议有什么区别?
2014/10/08 职场文书
个人债务授权委托书
2014/10/17 职场文书
给医院的感谢信
2015/01/21 职场文书
使用这 6个Vue加载动画库来减少我们网站的跳出率
2021/05/18 Vue.js
python数据可视化JupyterLab实用扩展程序Mito
2021/11/20 Python