PHP的JIT编译器
【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客
《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书
PHP是一种广泛使用的脚本语言,被用于构建各种规模的Web应用程序。然而,由于其解释执行的本质,PHP在处理大量计算密集型任务时可能会遇到性能瓶颈。为了解决这个问题,PHP 8引入了一个令人激动的新特性—JIT(即时编译)编译器。
JIT(Just-In-Time)编译器是一种在运行时将解释的代码转换为机器码的技术。这种转换可以显著提高代码的执行速度,使得PHP在处理复杂算法和大数据集时表现更出色。本节将深入探索PHP 8的JIT编译器,了解其工作原理、优势和使用技巧。
2.5.1 PHP中JIT编译器的特性
PHP中JIT编译器的特性包括解释执行、直接执行、解释执行过程和Opcache。
1. 解释执行
在解释执行中,代码是逐行解释并执行的。解释器读取源代码的任意行,同时分析该行的含义,并立即执行相应的操作。解释器将代码逐行翻译为机器指令并执行,不进行额外的编译步骤。每次执行代码时,都需要进行解释和执行的过程。
解释执行的优点是灵活性高,因为它可以根据具体环境和条件进行动态调整。它还支持动态特性,如动态类型和运行时代码修改。然而,解释执行的效率通常较低,因为它需要在执行过程中对代码进行解释和翻译,导致执行速度相对较慢。
2. 直接执行
在直接执行中,代码在执行之前会被编译成机器码(或类似的低级形式)。编译过程将源代码转换为一系列机器指令,这些指令可以直接在硬件上执行。直接执行通常是通过编译器完成的,这样可以将代码转换为与特定硬件架构相关的机器指令。
直接执行的优点是执行速度快,因为代码已经被预先编译成机器码了,因此不需要在执行时进行解释和翻译。它还可以进行各种优化,如静态类型检查和编译器优化。然而,直接执行通常缺乏灵活性,因为编译过程发生在执行之前,无法根据具体环境和条件进行动态调整。
3. 解释执行过程
下面介绍一下传统的PHP代码解释执行的过程:
(1)词法分析(Lexical Analysis):PHP解释器首先会将源代码分解为一个一个的词法单元(tokens)。词法单元可以是关键字、标识符、运算符、常量等。
(2)语法分析(Syntax Analysis):在这个阶段,PHP解释器将词法单元组合成语法结构,形成抽象语法树(Abstract Syntax Tree,AST)。抽象语法树表示了源代码的结构和语义。
(3)语义分析(Semantic Analysis):在这一阶段,PHP解释器会检查代码的语义正确性,包括变量和函数的声明、类型检查、作用域等。它还会解析命名空间、类、接口和其他语言特性。
(4)字节码生成(Bytecode Generation):在这个阶段,PHP解释器将抽象语法树转换为中间表示形式,即字节码。字节码是一种类似于机器码但不直接在硬件上执行的低级代码。
(5)执行:PHP解释器按照顺序逐条执行字节码指令。这是解释器的核心阶段,其中包括变量赋值、函数调用、条件判断、循环等操作。解释器会根据指令的操作码和操作数执行相应的操作。
需要注意的是,PHP在解释执行过程中是逐行解释的,即每次只执行一行代码。这与编译型语言不同,编译型语言在程序执行前会将源代码编译成机器码,然后直接在硬件上执行。
4. Opcache
Opcache是PHP的一个扩展,旨在提高PHP脚本的性能。它通过缓存编译后的字节码,避免在每次脚本执行时重复进行词法分析、语法分析和字节码生成的过程。
启用Opacache扩展后PHP的执行流程如下:
(1)检查是否有可用的字节码缓存,如果没有,则需要先生成字节码,步骤为:词法分析→语法分析→语义分析→字节码生成。
(2)PHP解释器执行缓存好的字节码。
2.5.2 PHP中的JIT编译器
虽然启用Opcache能够避免每次请求时都重新生成字节码,但字节码仍然需要通过PHP解释器来执行,这本质上仍然是解释执行的方式,因此性能上存在一定的限制。然而,引入JIT(即时编译器)后,频繁执行的热点代码可以被编译成原生机器码,这样CPU可以直接执行这些代码,显著提升了执行效率。
PHP的JIT编译器是对Opcache的一个补充而非替代品。JIT编译器在Opcache已经缓存好的字节码基础上,结合运行时的信息进行进一步优化,直接将字节码编译为机器码。
PHP的JIT工作原理概述如下:
- 热点代码识别:JIT通过监控代码的执行情况来识别热点代码。这些热点代码是指在程序运行时频繁被执行的代码片段,比如循环和计算密集型的函数。JIT技术会根据代码的执行频率和重要性来决定哪些代码应该被编译。
- 即时编译:一旦识别出热点代码,JIT便会将这些代码片段提取出来,并动态编译成机器码。这些编译后的机器码可以直接在硬件上执行,跳过了逐行解释的过程。
- 缓存与重用:编译后的机器码通常会存储在缓存中,以便后续执行时直接调用,避免了重复编译的过程,从而提升了执行效率。
- 动态优化:JIT还能应用多种优化技术来增强代码的执行性能。例如,它可以通过内联优化减少函数调用的开销,或者根据变量类型信息进行基于类型的优化,生成更高效的机器码。
在执行脚本时,如果已经有可用的机器码,那么将直接执行这些机器码,无须从Opcache获取字节码,也省去了生成字节码的步骤,从而实现了性能的大幅提升。
2.5.3 使用JIT编译器
前面的内容提到过,JIT编译器是构建在Opcache基础之上的,因此只需要安装Opcache扩展即可通过配置文件启用JIT。
下面是笔者在Mac系统下的Opcache配置文件,路径是/opt/homebrew/etc/php/8.3/conf.d/ ext-opcache.ini:
zend_extension=opcache.so
opcache.enable=1 # 开启Opacache
opcache.enable_cli=1 # 通过命令行执行PHP脚本时也启用Opcache
opcache.jit=1255
opcache.jit_buffer_size=64
而在Windows系统下使用JIT也是需要先开启Opcache,此扩展默认已经包含到 PHP Windows 版本中,只要在php.ini中启用这个扩展即可。使用Opcache可以自动编译和优化 PHP 脚本,并将它们缓存在内存中,这样就不会在每次加载页面时动态编译PHP脚本。在Windows系统中,Opcache需要配置在php.ini中,部分配置如下所示:
zend_extension=opcache
opcache.enable=1
opcache.enable_cli=0
opcache.jit=1255
opcache.jit_buffer_size=64
Windows系统中有关Opcache每个配置项的含义,读者可以参考PHP官网的帮助文档。
JIT编译器是PHP 8中引入的一个关键特性,其主要目的是提升PHP脚本的执行效率。与传统逐行解释执行的方式不同,JIT编译器能够将频繁执行的热点代码动态转换为机器码。这一转换过程消除了逐行解释的需要,显著加快了代码的执行速度。

相关文章:
PHP的JIT编译器
【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 PHP是一种广泛使用的脚本语言,被用于构建…...
Golang学习历程【第七篇 闭包type defer panic recover了解time包】
Golang学习历程【第七篇 闭包&type defer panic recover了解】 1. 闭包1.1 闭包的定义1.2 闭包的特点1.3 闭包的示例 2. 类型(type)2.1 自定义类型2.2 类型示例 3. 延迟执行(Defer)3.1 defer 的用法3.2 defer 示例 4. 恐慌(Panic…...
oracle表分区--范围分区
文章目录 oracle表分区分区的原因分区的优势oracle表分区的作用oracle表分区类型一、范围分区二、 创建分区表和使用:1、按照数值范围划分2、按照时间范围3、MAXVALUE2. 向现有表添加新的分区3、 分区维护和重新组织(合并/删除) oracle表分区…...
使用亚马逊针对 PyTorch 和 MinIO 的 S3 连接器进行模型检查点处理
2023 年 11 月,Amazon 宣布推出适用于 PyTorch 的 S3 连接器。适用于 PyTorch 的 Amazon S3 连接器提供了专为 S3 对象存储构建的 PyTorch 数据集基元(数据集和数据加载器)的实现。它支持用于随机数据访问模式的地图样式数据集和用于流式处理…...
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_monotonic_time函数
声明 在 src\core\ngx_times.c 中: static ngx_msec_t ngx_monotonic_time(time_t sec, ngx_uint_t msec); 实现 在 src\core\ngx_times.c 中: static ngx_msec_t ngx_monotonic_time(time_t sec, ngx_uint_t msec) { #if (NGX_HAVE_CLOCK_MONOTONIC)st…...
业务开发 | 基础知识 | Maven 快速入门
Maven 快速入门 1.Maven 全面概述 Apache Maven 是一种软件项目管理和理解工具。基于项目对象模型的概念(POM),Maven 可以从中央信息中管理项目的构建,报告和文档。 2.Maven 基本功能 因此实际上 Maven 的基本功能就是作为 Ja…...
基于 Python(Flask)、JavaScript、HTML 和 CSS 实现前后端交互的详细开发过程
以下是一个基于 Python(Flask)、JavaScript、HTML 和 CSS 实现前后端交互的详细开发过程: --- ### 一、技术选型 1. **后端**:Python Flask(轻量级Web框架) 2. **前端**:HTML/CSS JavaScript&…...
STM32 RCC功能说明 复位和时钟控制RCC
目录 背景 RCC配置时钟主要涉及两方面 程序 第1步、RCC默认初始化 第2步、等待HSE工作稳定 第3步、设置PLL时钟源以及倍频数 第4步、设置AHB总线时钟(HCLK) 第5步、设置PCLK1(APB1总线) 第6步、设置PCLK2(APB2总线) 第7步、FLASH存储器的配置 …...
Windows可以永久暂停更新了
最终效果图: 第一步: winR组合键打开运行对话框,输入“regedit”,点击“确定”或回车: 第二步: 注册表定位到“\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings”,新建DWO…...
高级 Python Web 开发:基于 FastAPI 构建高效实时聊天系统与并发控制
高级 Python Web 开发:基于 FastAPI 构建高效实时聊天系统与并发控制 目录 🌐 WebSocket 实时通讯概述💬 FastAPI 中实现 WebSocket 聊天系统🔧 WebSocket 并发控制与性能优化🔒 WebSocket 安全性与认证机制…...
深入理解Java虚拟机(JVM)
JVM概述 JVM作用 java虚拟机负责装载字节码到其内部,解释/编译为对应平台上的机器码指令执行,通俗说就是将字节码转换为机器码 JVM内部构造 1、类加载部分:负责把硬盘上的字节码加载到内存中(运行时数据区) 2、运…...
笔试面试——逻辑题
1.n从1开始,每个操作可以选择对n加1或者对n加倍,若想获得整数2014,最少需要多少个操作。 2.一个池塘,养龙虾若干,请想一个办法尽量准确的估算其中有多少龙虾? 3. S先生,P先生,Q先生他们知道桌子…...
【深度学习入门实战】基于Keras的手写数字识别实战(附完整可视化分析)
本人主页:机器学习司猫白 ok,话不多说,我们进入正题吧 项目概述 本案例使用经典的MNIST手写数字数据集,通过Keras构建全连接神经网络,实现0-9数字的分类识别。文章将包含: 关键概念图解完整实现代码训练过程可视化模型效果深度分析环境准备 import numpy as np impo…...
软考高级《系统架构设计师》知识点(一)
计算机硬件 校验码 码距:就单个编码A:00而言,其码距为1,因为其只需要改变一位就变成另一个编码。在两个编码中,从A码到B码转换所需要改变的位数称为码距,如A:00要转换为B:11,码距为2。一般来说,…...
用大模型学大模型01-制定学习计划
提示词:我想学习大模型,需要AI制定一个完整的学习计划,并给出学习路径和学习资料。以教科书目录的方式给出学习路线 第1章:数学与编程基础(4-6周) 1.1 数学基础 线性代数(矩阵运算、特征值分…...
lvs的DR模式
基于Linux的负载均衡集群软件 LVS 全称为Linux Virtual Server,是一款开源的四层(传输层)负载均衡软件 Nginx 支持四层和七层(应用层)负载均衡 HAProxy 和Nginx一样,也可同时支持四层和七层(应用层)负载均衡 基于Linux的高可用集群软件 Keepalived Keepalived是Linux…...
mysql读写分离与proxysql的结合
上一篇文章介绍了mysql如何设置成主从复制模式,而主从复制的目的,是为了读写分离。 读写分离,拿spring boot项目来说,可以有2种方式: 1)设置2个数据源,读和写分开使用 2)使用中间件…...
【C++学习篇】C++11第二期学习
目录 1. 可变参数模板 1.1 基本语法及原理 1.2 包扩展 1.3empalce系列接⼝ 2. lamba 2.1 lambda的语法表达式 2.2 捕捉列表 2.3 lamba的原理 1. 可变参数模板 1.1 基本语法及原理 1. C11⽀持可变参数模板,也就是说⽀持可变数量参数的函数模板和类模板&…...
TextWebSocketHandler 和 @ServerEndpoint 各自实现 WebSocket 服务器
TextWebSocketHandler 和 ServerEndpoint 都可以用于实现 WebSocket 服务器,但它们属于不同的技术栈,使用方式和功能有一些区别。以下是它们的对比: 1. 技术栈对比 特性TextWebSocketHandler (Spring)ServerEndpoint (Java EE/JSR-356)所属框…...
【C++高并发服务器WebServer】-18:事件处理模式与线程池
本文目录 一、事件处理模式1.1 Reactor模式1.2 Proactor模式1.3 同步IO模拟Proactor模式 二、线程池 一、事件处理模式 服务器程序通常需要处理三类事件:I/O事件、信号、定时事件。 对应的有两种高效的事件处理模式:Reactor和Proactor,同步…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
