深入理解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笔记之:日期函数的使用介绍
Apr 24 PHP
具有时效性的php加密解密函数代码
Jun 19 PHP
解析array splice的移除数组中指定键的值,返回一个新的数组
Jul 02 PHP
制作安全性高的PHP网站的几个实用要点
Dec 30 PHP
PHP的文件操作与算法实现的面试题示例
Aug 10 PHP
Zend Framework教程之配置文件application.ini解析
Mar 10 PHP
php反射类ReflectionClass用法分析
May 12 PHP
php 判断过去离现在几年的函数(实例代码)
Nov 15 PHP
yii使用bootstrap分页样式的实例
Jan 17 PHP
php中类和对象:静态属性、静态方法
Apr 09 PHP
php实现往pdf中加数字签名操作示例【附源码下载】
Aug 07 PHP
关于PhpStorm设置点击编辑文件自动定位源文件的实现方式
Dec 30 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获取字段名示例分享
2014/03/03 PHP
原生javascript和jquery判断浏览器版本等信息
2013/07/04 Javascript
当某个文本框成为焦点时即清除文本框内容
2014/04/28 Javascript
jQuery源码分析之jQuery.fn.each与jQuery.each用法
2015/01/23 Javascript
JQuery动画与特效实例分析
2015/02/02 Javascript
jquery实现鼠标悬浮停止轮播特效
2020/08/20 Javascript
DeviceOne 让你一见钟情的App快速开发平台
2016/02/17 Javascript
Node.js中防止错误导致的进程阻塞的方法
2016/08/11 Javascript
又一款js时钟!transform实现时钟效果
2016/08/15 Javascript
jquery过滤特殊字符',防sql注入的实现方法
2016/08/17 Javascript
JQuery和PHP结合实现动态进度条上传显示
2016/11/23 Javascript
jQuery zTree树插件简单使用教程
2017/01/10 Javascript
HTML5开发Kinect体感游戏的实例应用
2017/09/18 Javascript
JavaScript 中 JSON.parse 函数 和 JSON.stringify 函数
2018/12/05 Javascript
Python splitlines使用技巧
2008/09/06 Python
Python使用turtule画五角星的方法
2015/07/09 Python
Python数组定义方法
2016/04/13 Python
分享Python开发中要注意的十个小贴士
2016/08/30 Python
用python3教你任意Html主内容提取功能
2018/11/05 Python
python整合ffmpeg实现视频文件的批量转换
2019/05/31 Python
Python之——生成动态路由轨迹图的实例
2019/11/22 Python
运行tensorflow python程序,限制对GPU和CPU的占用操作
2020/02/06 Python
Python requests获取网页常用方法解析
2020/02/20 Python
浅析NumPy 切片和索引
2020/09/02 Python
娇韵诗香港官网:Clarins香港
2020/08/13 全球购物
Android面试题附答案
2014/12/08 面试题
会计学财务管理专业个人的自我评价
2013/10/19 职场文书
工业设计专业自荐书
2014/06/05 职场文书
“四风”问题整改措施和努力方向
2014/09/20 职场文书
学校领导班子四风问题整改意见
2014/10/02 职场文书
后勤工作个人总结
2015/02/28 职场文书
女性健康知识讲座通知
2015/04/23 职场文书
仙境之桥观后感
2015/06/16 职场文书
浪漫婚礼主持词开场白
2015/11/24 职场文书
CSS 制作波浪效果的思路
2021/05/18 HTML / CSS
css常用字体属性与背景属性介绍
2022/02/28 HTML / CSS