Php JIT 使用详解
简介
PHP 8
引入的 JIT
(Just-In-Time 编译器) 是该版本的一个重要性能特性,首次让 PHP
有了运行时即时编译的能力,从解释型语言迈向了“编译执行”的方向。
什么是 JIT?
JIT
是 即时编译(Just-In-Time compilation) 的缩写,作用是在运行时把 PHP
字节码(Opcode
)编译成本地机器码,跳过 Zend VM
的解释执行步骤,提高运行效率。
核心机制包括:
-
与
OPcache
集成JIT
作为OPcache
的扩展实现,在OPcache
的优化(如操作码缓存、数据流分析)基础上进一步生成机器码。 -
多阶段编译
-
解释执行阶段:
PHP
代码首先被解析为OPcode
(中间代码)。 -
热点识别:通过运行时统计(如循环次数、函数调用频率)确定需优化的代码段(即“热代码”)。
-
机器码生成:使用
DynASM
(基于LuaJIT
的汇编器)将热代码编译为机器码,后续执行直接调用机器码。
-
简单来说:
-
之前的执行流程(
PHP 7
及以下):
PHP
代码 → 编译成Opcode
→Zend
虚拟机解释执行 -
PHP 8
的JIT
流程:
PHP
代码 → 编译成Opcode
→JIT
编译成本地机器码 →CPU
执行
如何启用 JIT?
JIT
是 Opcache
的一部分,配置文件在 php.ini
中进行设置。
- 步骤 1:开启
Opcache
opcache.enable=1
opcache.enable_cli=1
- 步骤 2:开启
JIT
opcache.jit=1255
opcache.jit_buffer_size=100M
参数说明:
-
opcache.jit_buffer_size:JIT
使用的内存缓冲区,必须设置大于 0 才会启用JIT
(推荐 100M 起)。 -
opcache.jit
:JIT
的级别和策略编码(常用值见下方)。
JIT 策略说明(opcache.jit)
JIT
有四种 策略模式(strategy
),值的计算方式如下:
opcache.jit = function_tracing + (strategy * 256)
策略(strategy) | 名称 | 说明 |
---|---|---|
0 | disable | 禁用 JIT |
1 | tracing | 最优化,适合长时间运行脚本 |
2 | function | 编译整个函数/方法 |
3 | return | 编译返回点 |
4 | call | 编译调用点 |
例如:
1255 = 4 * 256 + 231
:表示策略为 call
,函数级别为 231
。
常用推荐配置:opcache.jit=1255
JIT 对性能的影响
类型 | 性能提升 |
---|---|
数学密集运算 | 极大提升(最高 10 倍) |
I/O 密集任务 | 几乎无提升 |
Web 请求响应 | 提升有限(10~20%) |
JIT
对 Web
项目的实际性能提升 并不显著,因为 Web
应用大部分时间花在数据库、网络、I/O
等非 CPU
密集型操作上。
适合使用 JIT 的场景
-
图像处理、数学运算(如
Mandelbrot、FFT
) -
视频处理、机器学习扩展
-
长生命周期的
PHP
应用(如Swoole/Hyperf
、RoadRunner
) -
命令行
PHP
(开启opcache.enable_cli=1
)
不建议使用 JIT 的场景
-
I/O
密集型Web
项目(如Laravel
普通Web
应用) -
内存受限服务器
-
小型脚本或
CLI
工具(冷启动成本不划算)
如何检测 JIT 是否生效?
- 使用
PHP CLI
执行:
php -i | grep JIT
示例输出:
opcache.jit => 1255
opcache.jit_buffer_size => 100M
opcache.jit_debug => 0
opcache.jit_status => enabled
- 也可以通过
Web
页面:
查找 JIT
区块,确认是否启用。
phpinfo();
JIT 状态查看
$jitStatus = opcache_get_status(true);
print_r($jitStatus['jit']);
JIT 的限制与注意事项
-
内存开销:
JIT
缓冲区(opcache.jit_buffer_size
)会占用额外内存,需根据业务规模调整。 -
架构限制:仅支持
x86-64
架构,ARM
或其他架构(如M1
芯片)暂不支持。 -
兼容性问题:部分
PHP
扩展(如xdebug
)可能与JIT
冲突,需关闭调试工具。 -
版本差异:
PHP 8.0
的JIT
稳定性较弱,建议升级至PHP 8.1+
(修复了大量编译优化问题)。
相关文章:
Php JIT 使用详解
简介 PHP 8 引入的 JIT(Just-In-Time 编译器) 是该版本的一个重要性能特性,首次让 PHP 有了运行时即时编译的能力,从解释型语言迈向了“编译执行”的方向。 什么是 JIT? JIT 是 即时编译(Just-In-Time c…...

视觉分析开发范例:Puppeteer截图+计算机视觉动态定位
一、选型背景:传统爬虫已无力应对的视觉挑战 在现代互联网环境中,尤其是小红书、抖音、B站等视觉驱动型平台,传统基于 HTML 的爬虫已经难以满足精准数据采集需求: 内容加载由 JS 动态触发,难以直接解析 HTML…...

Linux 基础开发工具的使用
目录 前言 一:下载工具yum 二:文本编辑器vim 1. 命令模式 2. 插入模式 3. 底行模式 三:gcc和g 基本使用格式 常用选项及作用 编译过程示例 四、Linux 项目自动化构建工具 ——make/Makefile 1. make 与 Makefile 的关系 2. Make…...
ElasticSearch查询指定时间内出现的次数/2秒内出现的次数
查询指定时间内出现的次数 POST process-log/_search {"size": 0,"query": {"bool": {"filter": [{"range": {"requestTime": {"from": 1722470400000,"to": 1722556800000}}}]}},"agg…...

华为云Flexus+DeepSeek征文 | Dify-LLM平台一键部署教程及问题解决指南
作者简介 我是摘星,一名专注于云计算和AI技术的开发者。本次通过华为云MaaS平台体验DeepSeek系列模型,将实际使用经验分享给大家,希望能帮助开发者快速掌握华为云AI服务的核心能力。 目录 1. 前言 2. 准备工作 2.1 注册华为云账号 2.2 确…...
STP协议:如何消除网络环路风暴
生成树协议(STP,Spanning Tree Protocol)的主要功能: 消除网络环路导致的广播风暴问题(环路会引发MAC地址表不稳定)防止网络中的主机接收重复数据帧 STP工作原理: 选举根桥(Root …...

哈工大计算机系统2025大作业——Hello的程序人生
计算机系统 大作业 题 目 程序人生-Hello’s P2P 专 业 计算学部 学 号 2023113072 班 级 23L0513 学 生 董国帅 指 导 教 师 史先俊 计算机科学与…...
物联网常用协议Modbus、CAN、BACnet介绍
一、Modbus Modbus 作为工业通信领域的基石,是一款被广泛应用的工业通信协议,主要用于实现可编程逻辑控制器(PLC)等工业电子设备之间的连接。1979 年,Modicon 公司(现施耐德电气的一部分)开发了这一协议,旨在简化工厂内设备间的通信流程。经过多年发展,Modbus 衍生出…...

Vue中van-stepper与input值不同步问题及解决方案
一、问题描述 在使用Vant UI的van-stepper步进器组件与原生input输入框绑定同一响应式数据时,出现以下现象: 通过步进器修改值后,页面直接输出{{ count }}和watch监听器均能获取最新值但input输入框显示的数值未同步更新,仍为旧…...

react基础技术栈
react基础技术栈 react项目构建react的事件绑定React组件的响应式数据条件渲染和列表循环表单绑定 Props和组件间传值,插槽react中的样式操作 生命周期ref 和 context函数组件和hook高阶组件React性能问题React-route的三个版本react-router使用步骤react-router提供…...

Three.js搭建小米SU7三维汽车实战(4)场景搭建
场地搭建 javascript // 导入threejs import * as THREE from "three"; // 导入轨道控制器 import { OrbitControls } from "three/addons/controls/OrbitControls.js"; // 1. 创建场景 const scene new THREE.Scene(); // 2. 创建相机 const camera ne…...
redis五种数据结构底层实现
参考文档: redis5种数据结构底层实现...

Excel 统计某个字符串在指定区域出现的次数
【本文概要】 Excel 统计某个字符串在指定区域出现的次数: 1、Excel 统计一个单元格内的某字符串的出现次数 2、Excel 统计某一列所有单元格内的某字符串的出现次数 3、Excel 统计某一区域所有单元格内的某字符串的出现次数 1、Excel 统计一个单元格内的某字符串的出…...
【Kubernetes】ubuntu20.04通过kubeadm + Docker安装k8s
Kubernetes v1.24集群安装配置步骤总结 一、环境准备 (一)系统要求 运行兼容deb/rpm的Linux操作系统(如Ubuntu或CentOS)的计算机,1台或多台。每台机器内存2GB以上,内存不足会限制应用运行。控制平面节点…...
前端开源JavaScrip库
以下内容仍在持续完善中,如有遗漏或需要补充之处,欢迎在评论区指出。感谢支持,如果觉得有帮助,欢迎点赞鼓励。感谢支持 JavaScript 框架Vue.jsVue.js - 渐进式 JavaScript 框架 | Vue.jsReactReactAngularHome • AngularjQueryj…...

【Linux我做主】进度条小程序深度解析
Linux下C语言进度条程序深度解析 进度条小程序GitHub地址 前言前置知识回车换行(CR/LF)的深度解析历史渊源与技术规范在进度条/倒计时中的应用 缓冲区机制的全面剖析缓冲区引入缓冲类型对比进度条开发中的关键控制 进度条实现以小见大——倒计时倒计时最…...
MySQL 使用全局锁会导致的问题?
MySQL 使用全局锁会导致以下核心问题: 业务停摆与主从延迟 主库备份:备份期间所有更新操作被阻塞,业务系统陷入等待状态从库备份:无法执行主库同步的 binlog,导致主从复制延迟加剧 并发性能急剧下降 …...

从Homebrew找到openssl.cnf文件并拷贝到Go项目下使用
安装OpenSSL 在 macOS 上下载和安装 OpenSSL 最常见和推荐的方式是使用 Homebrew,这是一个 macOS 缺失的包管理器。 如果您还没有安装 Homebrew,请先安装它。安装 Homebrew 后,安装 OpenSSL 只需要一条命令。 步骤 1:安装 Home…...
在Java对象转JSON字符串时不显示无值参数
在Java中,可以通过在展示数据的逻辑中添加判断条件来实现这一需求。以下是一些常见的场景和实现方法: 场景一:在Java对象转JSON字符串时 使用Gson库 代码实现 首先引入Gson依赖,如果使用Maven构建项目,在pom.xml文件中…...
在 Ubuntu 服务器上 下载 Clash 文件使用代理
文件Clash.Verge_1.3.8_x64_portable.zip 在 Ubuntu 服务器上不能使用这个Clash 文件**,我们需要的是 Clash.Meta 而不是 Clash Verge GUI 客户端 也就是 Clash Verge GUI 客户端的 Windows 版本,是给 Windows 桌面环境用的图形界面,不适用…...

微信小程序一次性订阅封装
封装代码如下: export async function subscribeMessage(tmplIds: string[]): Promise<ISubscribeMessagePromise> {// 模板ID// 1、获取设置状态const settings (await wx.getSetting({ withSubscriptions: true })).subscriptionsSetting || {}console.log…...
Spring AI MCP的几个小问题
测试时间:2025/05/29 测试版本:Spring AI 1.0.0 问题1:由于启动顺序问题,MCP的服务器端和客户端不能在一个应用里,不然客户端连不上服务器会报错退出。(实际项目应该没有这样用的) 问题2:现在如果配置了…...

安全帽检测算法AI智能分析网关V4守护工地/矿山/工厂等多场景作业安全
一、方案概述 在工业生产与建筑施工场景中,安全帽是保障人员安全的重要装备。但传统人工巡检效率低、易疏漏,难以满足现代安全管理需求。AI智能分析网关V4安全帽检测方案,借助人工智能与计算机视觉技术,实现作业现场安全帽佩戴…...
Pycharm的简单介绍
目录 1. 起源与发展历史 2. 定位与核心作用 3. 主要版本 4. 应用场景 5. 核心功能与优势 6. 优缺点分析 7. 使用入门指南 8. 适用人群 9. 替代工具对比 总结 1. 起源与发展历史 公司背景:由捷克公司 JetBrains(成立于2000年)开发&a…...
重新安装解决mac vscode点击不能跳转问题
依次执行以下过程 删除vscode程序 删除vscode的缓存文件夹(xxx表示你的用户名) /Users/xxx/Library/Application Support/Code 重新安装vscode 这时候你会反向可以跳转项目内的import 文件以及自定义函数。但是import安装的包还不能点击跳转 配置python环境 如果你电脑没有安…...
Go语言中flag包的用法详解
在Go语言编程中,flag包是标准库中用于解析命令行参数的强大工具。它提供了一种简单且灵活的方式来定义和处理命令行标志(flag),使得程序能够从命令行接收用户输入的参数。本文将详细介绍flag包的用法,包括基本概念、常…...

Python自动化之selenium语句——打开、关闭浏览器和网页
目录 一、打开谷歌浏览器 1.双击桌面的Pycharm工具 2.新建Python文件,输入文件名 3.新建的Python文件如下 4.安装selenium库 5.导入包 二、打开网页、关闭网页、关闭浏览器 1.导入增加一个时间包 2.使用函数打包之前写的浏览器的配置 3.调用 4.打开百度网…...

【数据结构】--二叉树--堆(上)
一、树的概念和结构 概念: 树是一种非线性的数据结构,他是由n(n>0)个有限结点组成一个具有层次关系的集合。其叫做树,是因为他倒过来看就和一棵树差不多,其实际上是根在上,树枝在下的。 树的特点: 1…...
Rust 学习笔记:使用迭代器改进 minigrep
Rust 学习笔记:使用迭代器改进 minigrep Rust 学习笔记:使用迭代器改进 minigrep不使用 clone,而使用迭代器使用迭代器适配器使代码更清晰在循环或迭代器之间进行选择 Rust 学习笔记:使用迭代器改进 minigrep 前情提要࿱…...

多线程(5)——单例模式,阻塞队列
目录 单例模式饿汉模式懒汉模式—单线程版懒汉模式—多线程版(经典面试题)懒汉模式—多线程版(改进) 阻塞队列阻塞队列是什么生产者消费者模型标准库中的阻塞队列-BlockingQueue阻塞队列实现 单例模式 单例模式是一种设计模式&am…...