深入理解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.MVC的模板标签系统(一)
Sep 05 PHP
聊天室php&amp;mysql(二)
Oct 09 PHP
杏林同学录(九)
Oct 09 PHP
刚才在简化php的库,结果发现很多东西
Dec 31 PHP
PHP对象Object的概念 介绍
Jun 14 PHP
php加密算法之实现可逆加密算法和解密分享
Jan 21 PHP
php操作mysql数据库的基本类代码
Feb 25 PHP
PHP对象相互引用的内存溢出实例分析
Aug 28 PHP
php使用cookie显示用户上次访问网站日期的方法
Jan 26 PHP
PHP的Laravel框架中使用消息队列queue及异步队列的方法
Mar 21 PHP
PHPExcel笔记, mpdf导出
May 03 PHP
PHP Header用于页面跳转时的几个注意事项
Oct 21 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中使用unset销毁变量并内存释放问题
2012/07/05 PHP
Win10 下安装配置IIS + MySQL + nginx + php7.1.7
2017/08/04 PHP
php插入mysql数据返回id的方法
2018/05/31 PHP
PHP观察者模式示例【Laravel框架中有用到】
2018/06/15 PHP
php将从数据库中获得的数据转换成json格式并输出的方法
2018/08/21 PHP
ExtJS TabPanel beforeremove beforeclose使用说明
2010/03/31 Javascript
利用jQuery接受和处理xml数据的代码(.net)
2011/03/28 Javascript
jQuery在html有效在jsp无效的原因及解决方法
2013/08/02 Javascript
js读取cookie方法总结
2014/10/31 Javascript
js实现浏览器窗口大小被改变时触发事件的方法
2015/02/02 Javascript
JS实现随机乱撞彩色圆球特效的方法
2015/05/05 Javascript
编写高性能Javascript代码的N条建议
2015/10/12 Javascript
深入剖析JavaScript面向对象编程
2016/07/12 Javascript
js实现StringBuffer的简单实例
2016/09/02 Javascript
Ajax实现不刷新取最新商品
2017/03/01 Javascript
js 监控iframe URL的变化实例代码
2017/07/12 Javascript
JS实现为动态添加的元素增加事件功能示例【基于事件委托】
2018/03/21 Javascript
JS实现常见的查找、排序、去重算法示例
2018/05/21 Javascript
JavaScript实现身份证验证代码实例
2019/08/26 Javascript
Python实现队列的方法
2015/05/26 Python
Python中方法链的使用方法
2016/02/23 Python
Python字符串处理实现单词反转
2017/06/14 Python
Python 实现数据库(SQL)更新脚本的生成方法
2017/07/09 Python
Python读取视频的两种方法(imageio和cv2)
2018/04/15 Python
python 递归深度优先搜索与广度优先搜索算法模拟实现
2018/10/22 Python
PySide和PyQt加载ui文件的两种方法
2019/02/27 Python
Pandas聚合运算和分组运算的实现示例
2019/10/17 Python
解决python gdal投影坐标系转换的问题
2020/01/17 Python
Django 实现对已存在的model进行更改
2020/03/28 Python
AmazeUI的下载配置与Helloworld的实现
2020/08/19 HTML / CSS
BrandAlley英国:法国折扣奢侈品网上零售商
2017/07/03 全球购物
简历中自我评价分享
2013/10/09 职场文书
微型企业创业投资计划书
2014/01/10 职场文书
促销活动总结怎么写
2014/06/25 职场文书
授权委托书格式范文
2014/08/02 职场文书
个人收入证明模板
2014/09/18 职场文书