当前位置: 首页 > news >正文

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&#xf…...

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 安全性与认证机制&#x1…...

深入理解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,同步…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异&#xff…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

Linux-进程间的通信

1、IPC: Inter Process Communication(进程间通信): 由于每个进程在操作系统中有独立的地址空间,它们不能像线程那样直接访问彼此的内存,所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...

基于小程序老人监护管理系统源码数据库文档

摘 要 近年来,随着我国人口老龄化问题日益严重,独居和居住养老机构的的老年人数量越来越多。而随着老年人数量的逐步增长,随之而来的是日益突出的老年人问题,尤其是老年人的健康问题,尤其是老年人产生健康问题后&…...

Linux系统:进程间通信-匿名与命名管道

本节重点 匿名管道的概念与原理匿名管道的创建命名管道的概念与原理命名管道的创建两者的差异与联系命名管道实现EchoServer 一、管道 管道(Pipe)是一种进程间通信(IPC, Inter-Process Communication)机制,用于在不…...

Unity-ECS详解

今天我们来了解Unity最先进的技术——ECS架构(EntityComponentSystem)。 Unity官方下有源码,我们下载源码后来学习。 ECS 与OOP(Object-Oriented Programming)对应,ECS是一种完全不同的编程范式与数据架构…...

数据库管理与高可用-MySQL故障排查与生产环境优化

目录 #1.1MySQL单案例故障排查 1.1.1MySQL常见的故障排查 1.1.2MySQL主从故障排查 #2.1MySQL优化 2.1.1硬件方面的优化 2.1.2进程方面的优化 #3.1MySQL存储引擎 3.1.1 MyISAM存储引擎 3.1.2 InnoDB存储引擎 1.1MySQL单案例故障排查 1.1.1MySQL常见的故障排查 (1&…...

Continue 开源 AI 编程助手框架深度分析

Continue 开源 AI 编程助手框架深度分析 一、项目简介 Continue 是一个模块化、可配置、跨平台的开源 AI 编程助手框架,目标是让开发者能在本地或云端环境中,快速集成和使用自定义的 LLM 编程辅助工具。它通过支持 VS Code 与 JetBrains 等主流 IDE 插件…...