PHP代码如何被执行?

OpenBCI脑电数据处理实战:用MNE库从Raw对象到可视化分析全流程 本文提供了使用MNE-Python库处理OpenBCI脑电数据的完整实战指南。从通过BrainFlow库获取原始数据流、创建核心的Raw对象,到进行工频滤波、带通滤波等关键预处理步骤,最后实现时域信号、功率谱密度及地形图等多种专业可视化分析,手把手教你完成脑机接口数据处理的全流程。 阅读详情

    众所周知,计算机的CPU只能执行二进制的机器码,每种CPU都有对应的汇编语言,汇编语言编译器将汇编语言翻译成二进制的机器语言,然后CPU开始执行这些机器码。汇编语言作为机器语言与程序设计者之间的一个层,给我们带来了很多方便,程序员不需要用晦涩的01数字来书写程序,当然人们并不满足这样的一个进步,于是在汇编语言之上又多了一个层-C语言,C语言更贴近人类熟悉的“自然语言”,程序设计者可以通过C语言编译器将C源代码文件编译成目标文件(二进制文件,中间会先翻译成汇编语言,然后由汇编语言生成机器码),然后将各个目标文件连接在一起就组成了一个可执行文件。正如有人说过的一句名言“计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决”(“Any problem in computer science can be solved by another layer of indirection.”) PHP语言就是在C语言之上的一个层,PHP引擎是由C语言来实现的,因此PHP语言这一个在C之上抽象出来的层使用起来比C更简单方便,入门门槛更低。

   那么,PHP语言究竟如何被执行呢?

   PHP语言到C语言之间的转换如果使用“翻译”这个词是不够准确的,因为引擎不是将PHP语言转换成C语言,然后将转换后的C语言编译链接执行。引擎在解析PHP代码的时候通常是分为两个部分,编译和执行:

 

编译阶段:引擎把PHP代码转换成op code中间代码
执行阶段:引擎解释并执行编译阶段产生的op code

 

    关于op code会有专门的文章来介绍,现在网络上也已经有很多相关内容的文章,总之PHP代码会被编译成_zend_op_array的形式,这是一个结构体,其中包括很多相关属性,以及最重要的成员zend_op *opcodes, 即opcode的数组。执行阶段引擎会按照顺序执行各个opcode。

    目前5.3.2版本的PHP中,opcode一共有154种,可以在{PHPSRC}/Zend/zend_vm_opcodes.h看到这些opcode的宏定义。op的结构定义为:

 

struct _zend_op {
    opcode_handler_t handler;
    znode result;
    znode op1;
    znode op2;
    ulong extended_value;
    uint lineno;
    zend_uchar opcode;
};

 

其中的成员opcode就对应154个opcode宏定义中的一个,每一个op根据opcode和操作数的类型不同都会对应一个相关的执行句柄(opcode_handler_t handler),执行句柄是一个函数指针,op的执行执行句柄都定义在{PHPSRC}/Zend/zend_vm_execute.h中,这个文件可以通过一个PHP脚本({PHPSRC}/Zend/zend_vm_gen.php)来生成,这个PHP脚本用来生成zend_vm_opcodes.h和zend_vm_execute.h两个文件,zend_vm_execute.h的内容会根据生成时的参数不同而不同,这里主要是可以定置zend 引擎对op的分发方式,比如用CALL,SWITCH,GOTO,默认的是用CALL,也就是函数调用,所以这里就以函数调用来简单的介绍下这个文件的功能(文件极大,有近36000行,所以不要仔细啃),在这个文件中所有定义为 static int ZEND_FASTCALL 并且以 ZEND_* 开头的函数就是op的句柄,此文件中第一个函数execute是执行op的主方法,以这里作为入口执行一连串的op。可以说整个PHP的功能特性都是通过这些op句柄完成的(当然这些句柄会间接调用其他模块中的功能),那么这154个opcode如何对应到这些static int ZEND_FASTCALL  ZEND_*的执行句柄的呢?同样在这个文件中,可以看到zend_init_opcodes_handlers函数,这个函数初始化一个 static const opcode_handler_t labels[]数组,这个 labels数组就是handlers的一张表,这个表有近4000个项,有一个算法将一个opcode映射到这个表中的一个元素,算法同样在zend_vm_execute.h中可以找到,靠近文件结尾zend_vm_set_opcode_handler和zend_vm_get_opcode_handler就是这个算法的实现。

    那么引擎是如何通过这些op handler实现PHP语言的特性的呢?这里我举一个最简单的例子:考虑下面只有一行的PHP代码

<?php

    $a = 123;

?>

通过某种方法(以后再介绍这些方法)我们可以知道这行代码主要生成一个zend_op,其主要成员值为:

opcode = 38  (对应#define ZEND_ASSIGN  38)

op1       = $a ($a变量实际上是以cv形式存在,以后介绍)

op2       = 123 (以const常量形式存在)

handler = ZEND_ASSIGN_SPEC_CV_CONST_HANDLER(得到这个handler的名字不是一件容易的事,以后给出方法)

  

    opcode ZEND_ASSIGN的意思是将一个常量赋值给一个cv(compiled variable),这个cv其实就是$a变量的一种存在形式。在zend_vm_execute.h中搜索到ZEND_ASSIGN_SPEC_CV_CONST_HANDLER的定义,其主要功能就是取op2的值123,将其赋值给op1的变量,当然这个过程比想象中的要复杂一些,会有变量的初始化,变量的写时赋值等过程,以后会介绍每一个过程。这样这条PHP语句的功能就完成了。可以看出,op handler只是按照一些固定的方式来对操作数op1 op2(可能还有result)进行操作,handler不理会这些操作数中的具体值,这些值是在编译阶段生成op的时候确定的,比如如果$a = 123 改成 $a =456,那么生成的op中op2就是456了,handler始终按照固定的方式来处理。

    因此我们能知道,PHP的执行过程是先通过编译器将PHP代码编译成op code,然后然后zend虚拟机按照一定顺序执行这些opcode,具体是将每个opcode分发给特定的op code handler。

2.1 amdgpu BO的类型和用途 AMDGPU驱动中,amdgpu_bo_create_user和amdgpu_bo_create_kernel分别用于创建用户空间和内核空间的buffer对象(BO)。用户空间BO支持元数据、tiling flags等属性,由GEM handle管理生命周期;内核BO则用于驱动内部资源如ringbuffer,自动pin并可选CPU映射。二者在返回类型、生命周期管理和使用场景上存在根本差异,前者面向图形渲染/AI等应用,后者服务于驱动内部任务。 阅读详情

相关推荐

从零到一:DAMASK与ABAQUS联合仿真的环境配置艺术

本文详细介绍了在Ubuntu 16.04系统中配置DAMASK与ABAQUS2017联合仿真环境的完整流程,涵盖系统基础环境搭建、Python科学计算环境构建、DAMASK核心安装与配置,以及ABAQUS集成与联合调试。通过实战案例和高级调试技巧,帮助用户快速掌握有限元分析中的晶体塑性模拟技术。

weixin_29253711的博客 857

PHP的五种运行方式

PHP的五种运行,通过常驻进程和FastCGI协议通信,减少了PHP解释器的启动和关闭次数,提高了处理效率和并发能力。优点:性能较好,因为PHP解释器模块嵌入在Web服务器中,可以直接解释和执行PHP脚本,提高处理速度。优点:性能强大,独立于Web服务器运行,可配置独立的进程池和进程管理策略,管理并发请求。缺点:需要手动在命令行中输入命令来执行脚本,不适合作为Web应用的运行方式。缺点:相对于服务器端解释方式和服务器端嵌入方式,配置和部署稍显复杂。缺点:配置稍复杂,需要更多的系统资源,不适合低配置的服务器。

php-yyds 8284

自动驾驶仿真(六)—— SIL软件在环仿真测试

自动驾驶仿真六—— SIL软件在环仿真测试1. 在环仿真测试2. SIL软件在环仿真测试2.1 模型配置参数2.2 S function生成实现2.3 结果对比3. 参考学习的书目教材 博主前面的博文已经简要介绍了Carsim、Prescan 与 Simulink 在 “V”型开发流程的一些应用,现今成熟的汽车控制系统软件都是以(Model Based Design,MBD)来开发,它以图形化的方式表达复杂的逻辑、代码可读性、可移植性、开发调试便利程度都大大增强,同时利用成熟的代码生成工具链,也避免了手工代

zhudj08的博客 8653

php程序的运行方法

作为小白刚接触到php语言,对于php代码的运行可能不太懂,同样我在接触时也不是很懂怎么运行,在各种网站学习后能够运行php代码,为此总结一下方法。 一、服务器的下载 作为一个初学者,我使用集成的服务器组件,包含有PHP、Apache、Mysql等服务,免去我们将时间花费在繁琐的配置环境过程中。在本次中我还用WampServer,下载地址为 http://www.wampserver.com/ 这...

fzykn06的博客 1万+

JS逆向-快手__NS_hxfalcon参数分析

现在快手H5接口都需要__NS_hxfalcon这个参数,这篇文章就是逆向这个参数

ckcookies的博客 4076

AXI VIP配置全指南:从报错到成功仿真的完整流程(Vivado 2023版)

本文详细解析了在Vivado 2023环境中配置AXI Verification IP(VIP)进行协议仿真的完整流程。针对常见的include和import报错问题,提供了具体的解决方案和代码示例,指导用户从IP核创建、参数化配置,到构建可工作的仿真测试平台,最终实现成功仿真。

gpt4scribbler的博客 233

PHP 的运行方式有哪些?

所以总的来说,PHP有各种的方式,对应不同的业务场景。KPHP,把PHP编译成C++代码。peachpie,把PHP便以为.NET平台程序PHP-JS,集成Node引擎的PHP扩展PHP-CPP,使用C++开发PHP扩展,代码很容易上手这些项目在我的另一篇文章有介绍:《PHP的几个有趣的打开方式:从基本到变态》https://phpreturn.com/index/a623dc0357dead.html。

PHP武器库 2603

Avellaneda & Stoikov’s market-making strategy 工程化处理

前2篇文章详细介绍了AS存货模型的做市策略,这次对于这些公式里面一些希腊字母的取值是如何计算的,如何做工程化并应用到生产环境中做一些说明。这个里面有一些重要参数:很直观,可以直接取值的有:s = current market mid price (中间价,也就是【最佳卖价+最佳买价】/2)q = quantity of assets in inventory of base asset (也就是买入多少价值的股票数量)

weixin_42480337的博客 7069

php运行流程及原理介绍

web软件的运行模式中,总是先在客户端(浏览器端),发起一个请求,然后,服务器端才产生反馈动作(就是"运行"程序),并因此返回给浏览器信息-(响应)(2)、如果hosts中没有找到,则到互联网上找对应IP(DNS服务器中)位置:操作系统/system32/drivers/etc/(3)、还是没有找到,终止请求,返回"找不到服务器"提示。注意:需要以管理员身份打开编辑器,才能编辑保存他。(1)、首先在本机hosts文件中找对应IP。注:运行代码php.exe -r “代码”

heshihu2019的博客 1351

3DMax马克杯制作教程

01 在前视图创建一个【圆柱体】,设置参数,长度为32,高度为82;高度分段12、边数为16;如图所示。 02 点击鼠标右键,把圆柱体转换为可编辑多边形,如图所示。 03 在修改面板中,选择【多边形】层级,在视图中选择所示的面,使用缩放工具稍微缩小一点,如图所示。 04 点击【插入设置】,如图所示。 设置插入数量为2.5mm。 05 点击【挤出设置】,如图所示。 ...

youximoxingEDO的博客 3478

本地部署gradle

在部署CAS构建执行包时,如果按照CAS的官方命令gradlew clean build,如果系统没安装过gradle,这个步骤将会从网上下载gradle,但是进度非常慢,耗时很长。为了更快地完成项目构建,我们可以直接在本地部署好gradle,节省一点时间。

益添的博客 780

php代码审计中的代码执行

文章目录闲扯代码执行和命令执行的区别eval/assert回调函数可变函数preg_replace的/e模式双引号导致代码执行修复方案 闲扯 菜鸡的我被拒绝了,有点悲丧,努力吧。这些内容是看视频学的,有些点还比较有用,尤其是preg_replace那里。 代码执行和命令执行的区别 代码执行是执行脚本代码,执行的是phpinfo();命令执行是执行系统命令,执行的是systeminfo。但是我们也可以通过代码执行调用system()函数,来达到命令执行的效果,所以有些人就搞不清两者的区别。 eval/asse

qq_43622442的博客 1547

OKX 欧易 交易机器人开发基础

接口文档: https://www.okx.com/docs-v5/zh/#overview REST API 常用请求 查看账户余额 结果数据格式: 获取限价 结果格式: 获取指数行情 数据结构: 下单 结果数据: 获取未成交订单列表 返回结果: 撤单 结果结构:

Willin Wang 的全栈升级指南 2万+

未执行PHP代码,而是在页面上显示代码

I'm trying to execute some PHP code on a project (using Dreamweaver) but the code isn't being run.

xfxf996的博客 2105

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

深入理解PHP代码的执行的过程

一、前言 语言是人们进行沟通和交流的表达符号,每种语言都有专属于自己的符号,表达方式和规则。 就编程语言来说,它也是由特定的符号,特定的表达方式和规则组成。语言的作用是沟通,不管是自然语言,还是编程语言,它们的区别在于自然语言是人与人之间沟通的工具, 而编程语言是人与机器之间的沟通渠道。    就PHP语言来说,它也是一组符合一定规则的约定的指令。 在编程人员将自己的想法以PHP语言实

risingsun001的专栏 1万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

PHP代码的执行的过程

一、前言 语言是人们进行沟通和交流的表达符号,每种语言都有专属于自己的符号,表达方式和规则。 就编程语言来说,它也是由特定的符号,特定的表达方式和规则组成。语言的作用是沟通,不管是自然语言,还是编程语言,它们的区别在于自然语言是人与人之间沟通的工具, 而编程语言是人与机器之间的沟通渠道。    就PHP语言来说,它也是一组符合一定规则的约定的指令。 在编程人员将自己的想法以PHP语

a2534725767的博客 8483

浅谈PHP代码执行中出现过滤限制的绕过执行方法

参考: https://www.leavesongs.com/PENETRATION/webshell-without-alphanum.html https://www.leavesongs.com/PENETRATION/webshell-without-alphanum-advanced.html 字符串异或绕过 只适用于PHP5

末初 · mochu7 3万+

php执行字符串代码,PHP代码执行

Eval函数介绍Eval函数的语法如下:eval ( string $code )$code是字符串型变量,是需要执行的PHP代码。代码不能包含打开/关闭PHP tags。比如,'echo "Hi!";'不能这样传入:''。但仍然可以用合适的PHP tag来离开、重新进入PHP模式。比如'echo "In PHP mode!"; ?>In HTML mode!PHP7.2.1返回的错...

weixin_28871885的博客 1052

让php代码执行php代码

eval (PHP 3, PHP 4 ) eval -- Evaluate a string as PHP code Description mixed eval ( string code_str) eval() evaluates the string given in code_str as PHP code. Among other things, this...

197

PHP代码执行原理到底是怎样的?

PHP 代码的执行原理涉及多个步骤,从代码的编写、解析、编译、执行到内存管理、请求处理、缓存机制、错误处理、会话管理、扩展和模块、性能优化和安全性等多个方面。理解这些原理有助于开发者更好地编写高效、安全的 PHP 代码。

长风破浪会有时的博客 948

PHP实现动态执行代码的方法

本文实例讲述了PHP实现动态执行代码的方法。分享给大家供大家参考,具体如下: 这里介绍的PHP动态执行,即在页面上直接输入代码,点击执行,返回执行结果 方法很简单,主要使用了: $newfunc = create_function(’’, $code); 函数来实现。 代码如下: <?php $code = 'return "no code!";'; if (isset($_POST['co...

小白的一次小程序编程的各种记录 1966

PHP常见的命令执行函数与代码执行函数

命令执行与代码执行

dys的博客 7086

php代码怎么执行_如何执行字符串的PHP代码

5:include能不能直接操作字符串好吧,前面的4种方法好像都不太满意,那就深挖一下这个思路吧首先,php中的include是什么原理?并没有去看过源码,猜一下吧,1:读取文件(fopen,fread之类的)2:解析php语法 3:运行代码那么,如果可以让fopen,fread操作字符串,也许这个问题就解决了?设想:把字符串转换为一个对象或者流,提供fopen,fread接口。首先想到php的S...

weixin_42534100的博客 277

php动态执行代码,PHP实现动态执行代码的方法

摘要:本文实例讲述了PHP实现动态执行代码的方法。分享给大家供大家参考,具体如下:这里介绍的PHP动态执行,即在页面上直接输入代码,点击执行,返回执行结果方法很简单,主要使用了:$newfunc=create_function('',$code);函数来实现。代码如下:...

weixin_27972919的博客 818

php以下代码不执行,html中的php代码不执行

我的html中的php代码不执行; html head titleBob's Auto Parts/title /head body h1Bob's Auto Parts/h1 h2Order Results/h2 ?php echo "pOrder process at:".date('H:i,jS F Y')."p"; ? /body /html 执行结果是 Bob's Auto Parts ...

weixin_33554776的博客 563

java 如何执行php代码_PHP代码如何被执行?

众所周知,计算机的CPU只能执行二进制的机器码,每种CPU都有对应的汇编语言,汇编语言编译器将汇编语言翻译成二进制的机器语言,然后CPU开始执行这些机器码。汇编语言作为机器语言与程序设计者之间的一个层,给我们带来了很多方便,程序员不需要用晦涩的01数字来书写程序,当然人们并不满足这样的一个进步,于是在汇编语言之上又多了一个层-C语言,C语言更贴近人类熟悉的“自然语言”,程序设计者可以通过C语言编译...

weixin_34462581的博客 753

PHP代码执行原理

//PHP代码执行过程 //1.将PHP代码转换成有标识的Token,可以使用token_get_all函数来进行查看 //2.语法分析将Token和符合规则的代码生成抽象语法树 //3.根据抽象语法树生成opcode,当虚拟机调用opcode的时候会找到背后的处理函数执行真正的处理, 例如echo 对应的opcode是ZEND_ECHO var_dump(token_get_a...

咖啡如同生活的专栏 439
下一篇: PHP解释器引擎执行流程
phpkernel
博客等级 码龄16年 96粉丝 13原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值