深入理解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 相关文章推荐
mysql 字段类型说明
Apr 27 PHP
php ci框架验证码实例分析
Jun 26 PHP
一个基于phpQuery的php通用采集类分享
Apr 09 PHP
常用PHP框架功能对照表
Oct 23 PHP
php一个解析字符串排列数组的方法
May 12 PHP
php将一维数组转换为每3个连续值组成的二维数组
May 06 PHP
ThinkPHP打水印及设置水印位置的方法
Oct 14 PHP
Paypal实现循环扣款(订阅)功能
Mar 23 PHP
Yii2选项卡的简单使用
May 26 PHP
php无限极分类实现方法分析
Jul 04 PHP
PHP基于array_unique实现二维数组去重
Jul 14 PHP
php实现记事本案例
Oct 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
PHP实现把MySQL数据库导出为.sql文件实例(仿PHPMyadmin导出功能)
2014/05/10 PHP
PHP定时任务获取微信access_token的方法
2016/10/10 PHP
PHP添加PNG图片背景透明水印操作类定义与用法示例
2019/03/12 PHP
PHP设计模式(四)原型模式Prototype实例详解【创建型】
2020/05/02 PHP
PhpStorm2020 + phpstudyV8 +XDebug的教程详解
2020/09/17 PHP
Prototype使用指南之enumerable.js
2007/01/10 Javascript
Javascript的构造函数和constructor属性
2010/01/09 Javascript
javascript实现简单计算器效果【推荐】
2016/04/19 Javascript
使用jquery提交form表单并自定义action的方法
2016/05/25 Javascript
BootStrap智能表单实战系列(八)表单配置json详解
2016/06/13 Javascript
微信小程序 九宫格实例代码
2017/01/21 Javascript
webpack将js打包后的map文件详解
2018/02/22 Javascript
基于vue中css预加载使用sass的配置方式详解
2018/03/13 Javascript
vue 使用自定义指令实现表单校验的方法
2018/08/28 Javascript
vue 点击按钮实现动态挂载子组件的方法
2018/09/07 Javascript
学习jQuery中的noConflict()用法
2018/09/28 jQuery
浅析vue-cli3配置webpack-bundle-analyzer插件【推荐】
2019/10/23 Javascript
Electron整合React使用搭建开发环境的步骤详解
2020/06/07 Javascript
[02:15]你好,这就是DOTA!
2015/08/05 DOTA
python读取html中指定元素生成excle文件示例
2014/04/03 Python
python通过scapy获取局域网所有主机mac地址示例
2014/05/04 Python
Python ORM框架SQLAlchemy学习笔记之安装和简单查询实例
2014/06/10 Python
python字符串,数值计算
2016/10/05 Python
各种Python库安装包下载地址与安装过程详细介绍(Windows版)
2016/11/02 Python
python去除字符串中的换行符
2017/10/11 Python
详解用Python处理HTML转义字符的5种方式
2017/12/27 Python
python3中rank函数的用法
2019/11/27 Python
Python第三方包PrettyTable安装及用法解析
2020/07/08 Python
Python3中FuzzyWuzzy库实例用法
2020/11/18 Python
解决margin 外边距合并问题
2019/07/03 HTML / CSS
本科毕业生自我鉴定
2013/11/02 职场文书
施工安全协议书
2013/12/11 职场文书
水果连锁超市创业计划书
2014/01/24 职场文书
遗失证明范文
2015/06/19 职场文书
java Nio使用NioSocket客户端与服务端交互实现方式
2021/06/15 Java/Android
简单聊聊TypeScript只读修饰符
2022/04/06 Javascript