深入理解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 会话(session 时间设定)使用入门代码
Jun 05 PHP
中英文字符串翻转函数
Dec 09 PHP
php模板中出现空行解决方法
Mar 08 PHP
Windows和Linux中php代码调试工具Xdebug的安装与配置详解
May 08 PHP
php导出csv格式数据并将数字转换成文本的思路以及代码分享
Jun 05 PHP
Linux安装配置php环境的方法
Jan 14 PHP
Yii多表联合查询操作详解
Jun 02 PHP
PHPExcel导出2003和2007的excel文档功能示例
Jan 04 PHP
PHP 信号管理知识整理汇总
Feb 19 PHP
PHP基于正则批量替换Img中src内容实现获取缩略图的功能示例
Jun 07 PHP
Thinkphp开发--集成极光推送
Sep 15 PHP
PHP 时间处理类Carbon
May 20 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
Yii框架关联查询with用法分析
2014/12/02 PHP
为百度UE编辑器上传图片添加水印功能
2015/04/16 PHP
PHP中Closure类的使用方法及详解
2015/10/09 PHP
解决出现SoapFault (looks like we got no XML document)的问题
2017/06/24 PHP
阿里云PHP SMS短信服务验证码发送方法
2017/07/11 PHP
用一段js程序来实现动画功能
2007/03/06 Javascript
基于jQuery的message插件实现右下角弹出消息框
2011/01/11 Javascript
JS对HTML标签select的获取、添加、删除操作
2013/10/17 Javascript
利用了jquery的ajax实现二级联互动菜单
2013/12/02 Javascript
使用insertAfter()方法在现有元素后添加一个新元素
2014/05/28 Javascript
Windows系统下Node.js的简单入门教程
2015/06/23 Javascript
JS正则表达式比较常见用法
2016/01/26 Javascript
全面详细的jQuery常见开发技巧手册
2016/02/21 Javascript
使用jQuery UI库开发Web界面的简单入门指引
2016/04/22 Javascript
canvas 实现中国象棋
2017/02/17 Javascript
jQuery的$.extend 浅拷贝与深拷贝
2017/03/08 Javascript
浅谈关于axios和session的一些事
2017/07/13 Javascript
vue的过滤器filter实例详解
2018/09/17 Javascript
Python 实现数据库(SQL)更新脚本的生成方法
2017/07/09 Python
python中数据爬虫requests库使用方法详解
2018/02/11 Python
Python import与from import使用及区别介绍
2018/09/06 Python
Python for循环与range函数的使用详解
2019/03/23 Python
Django中在xadmin中集成DjangoUeditor过程详解
2019/07/24 Python
基于tensorflow指定GPU运行及GPU资源分配的几种方式小结
2020/02/03 Python
Python模拟键盘输入自动登录TGP
2020/11/27 Python
css3隔行变换色实现示例
2014/02/19 HTML / CSS
兽医医药专业求职信
2014/07/27 职场文书
村干部群众路线教育活动对照检查材料
2014/10/01 职场文书
医院护士工作检讨书
2014/10/26 职场文书
医务人员医德考评自我评价
2015/03/03 职场文书
图书馆义工感想
2015/08/07 职场文书
升学宴祝酒词
2015/08/11 职场文书
pandas 操作 Excel操作总结
2021/03/31 Python
Nginx配置之实现多台服务器负载均衡
2021/08/02 Servers
win10以太网连接不上怎么办?Win10连接以太网详细教程
2022/04/08 数码科技
redis protocol通信协议及使用详解
2022/07/15 Redis