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

PHP - OPcache 字节码缓存 - 学习/实践

1.应用场景

主要用于学习PHP字节码缓存扩展的作用和实现原理,使用场景。

本文介绍了PHP官方字节码缓存扩展OPcache的作用与使用方法。OPcache通过将PHP脚本预编译为字节码并存储在共享内存中,显著提升PHP应用性能。主要内容包括:OPcache的工作原理(缓存字节码、共享内存机制)、安装启用方法(Linux系统安装及php.ini配置)、关键配置参数(内存分配、缓存文件数等)、状态监控方式以及性能优化建议。文章还提供了生产环境推荐配置、常见问题解决方案,并强调OPcache与APCu、Redis等工具的互补性。通过合理配置OPcache,可有效降低PHP脚本重复编译开销,特别适合高并发场景。

2.学习/操作

1.文档阅读

<<现代PHP模式>> -- 第33page 关于Zend OPcache

PHP: OPcache - Manual

PHP - APC/OPcache - 学习/实践_php apc-CSDN博客

AI问答

2.整理输出

OPcache 字节码缓存简介

OPcache 是 PHP 的官方字节码缓存扩展,通过将 PHP 脚本预编译为字节码并存储在共享内存中,减少重复编译的开销,显著提升 PHP 应用的执行效率。它从 PHP 5.5 开始内置,是优化 PHP 性能的关键工具。


OPcache 的工作原理

PHP 脚本在运行时会被解析为字节码(Opcode),再由 Zend 引擎执行。

OPcache 将编译后的字节码缓存到共享内存中,后续请求直接使用缓存的字节码,跳过重复的解析和编译阶段。

  • 缓存存储:字节码存储在共享内存中,避免每次请求重新加载。
  • 缓存更新:脚本文件修改后,OPcache 会检测并重新编译更新后的文件。
  • 内存优化:通过共享内存减少进程间的内存占用。

安装与启用 OPcache

OPcache 通常随 PHP 一起安装,但可能需要手动启用。

在 Linux 系统中安装
# 基于 Debian/Ubuntu
sudo apt-get install php-opcache# 基于 CentOS/RHEL
sudo yum install php-opcache
在 php.ini 中启用
zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1  # 可选,启用 CLI 模式的缓存

关键配置参数

OPcache 的行为通过 php.ini 中的参数调整,以下是一些常用配置:

基本配置
opcache.memory_consumption=128  # 共享内存大小(MB)
opcache.interned_strings_buffer=8  # 字符串缓存大小(MB)
opcache.max_accelerated_files=10000  # 最大缓存文件数
优化配置
opcache.validate_timestamps=1  # 是否检查文件更新(开发环境建议开启)
opcache.revalidate_freq=2  # 检查更新的频率(秒)
opcache.save_comments=1  # 保留注释(某些框架依赖注释)
opcache.fast_shutdown=1  # 快速关闭机制
生产环境推荐配置
opcache.validate_timestamps=0  # 关闭检查以提高性能
opcache.enable_file_override=1  # 允许覆盖函数

监控 OPcache 状态

通过 opcache_get_status() 函数或命令行工具查看缓存状态。

PHP 代码查看状态
<?php
print_r(opcache_get_status());
?>
命令行查看状态
php -r "print_r(opcache_get_status());"
关键指标
  • memory_usage:内存使用情况。
  • opcache_hit_rate:缓存命中率(理想值接近 100%)。
  • cached_scripts:已缓存的脚本数量。

OPcache 的性能优化建议

  1. 分配足够内存
    opcache.memory_consumption 应根据项目大小设置,避免因内存不足导致缓存失效。

  2. 调整缓存文件数量
    opcache.max_accelerated_files 应大于项目文件数,默认值可能不足。

  3. 生产环境禁用时间戳验证
    设置 opcache.validate_timestamps=0,通过手动重置缓存更新代码。

  4. 定期重启 PHP-FPM
    避免长时间运行后内存碎片化,可通过 Cron 任务定时重启。

  5. 结合 Composer 优化
    使用 composer dump-autoload -o 生成优化类加载映射,减少文件查找开销。


手动重置 OPcache

在生产环境中,更新代码后可能需要手动重置缓存。 -------------- 可以解决代码更新过程中的报错,如类常量,方法未定义,找不到的报错;

通过 PHP 函数重置
<?php
opcache_reset();
?>
通过命令行重置
php -r "opcache_reset();"
通过 Web 请求触发
curl http://localhost/opcache-reset.php

常见问题与解决方案

缓存未生效
  • 检查 php.ini 中 OPcache 是否启用。
  • 确认 opcache.enable=1 且无语法错误。
内存不足
  • 增加 opcache.memory_consumption 并监控命中率。
  • 减少缓存文件数或优化项目代码。
文件更新未检测到
  • 开发环境设置 opcache.validate_timestamps=1
  • 生产环境手动重置缓存或部署时重启 PHP 服务。

与其他优化工具结合

  1. APCu
    缓存用户数据,与 OPcache 互补(APCu 缓存数据,OPcache 缓存字节码)。

  2. Redis/Memcached
    缓存数据库查询结果,减少重复计算。

  3. CDN 和前端缓存
    减少 PHP 动态请求压力。


通过合理配置 OPcache,PHP 应用的性能可以得到显著提升,尤其是在高并发场景下。建议根据实际业务需求调整参数,并定期监控缓存状态以保持最佳性能。

3. 实践部分

环境

Mac Pro 

homebrew 安装PHP 

2.1 用处,优缺点

OPcache 通过将 PHP 脚本预编译的字节码存储到共享内存中来提升 PHP 的性能, 存储预编译字节码的好处就是 省去了每次加载和解析 PHP 脚本的开销。

PHP 5.5.0 及后续版本中已经绑定了 OPcache 扩展。 对于 PHP 5.2,5.3 和 5.4 版本可以使用 » PECL扩展中的 OPcache 库。 -- 官方原话

2.2 查看OPcache是否开启

方式一:浏览器直接访问输出 phpinfo();

方式二:通过命令查看

➜  conf.d php -m | grep OPcache

Zend OPcache

Zend OPcache

➜  conf.d

2.3 查看扩展配置文件

➜  php-test-temp php-config --ini-dir

/usr/local/etc/php/8.1/conf.d

➜  php-test-temp cd /usr/local/etc/php/8.1/conf.d

➜  conf.d ls

ext-opcache.ini

➜  conf.d cat ext-opcache.ini

[opcache]

zend_extension="/usr/local/opt/php/lib/php/20210902/opcache.so"

➜  conf.d

后续补充

...

3.问题/补充

TBD

4.参考

PHP: OPcache - Manual

<<现代PHP模式>> -- 第33page 关于Zend OPcache

后续补充

...


文章转载自:

http://5yHOavQW.rmqLf.cn
http://qQCCoSyP.rmqLf.cn
http://Ug4UhCYd.rmqLf.cn
http://UIWH3aLm.rmqLf.cn
http://e9y2t5Jo.rmqLf.cn
http://h7pPHst4.rmqLf.cn
http://Bu0RmRGY.rmqLf.cn
http://3OK9jtpv.rmqLf.cn
http://ChlBmrKP.rmqLf.cn
http://bxuxfhCS.rmqLf.cn
http://GCSs5z4M.rmqLf.cn
http://QtAyuzqe.rmqLf.cn
http://dxSbF41l.rmqLf.cn
http://wIaAo9sR.rmqLf.cn
http://a4zp90xV.rmqLf.cn
http://dIviBeid.rmqLf.cn
http://CIKf3Ky5.rmqLf.cn
http://taIuk6i6.rmqLf.cn
http://pZJ66j3T.rmqLf.cn
http://zzhSG95F.rmqLf.cn
http://bgkoVPSK.rmqLf.cn
http://5BI58Vfp.rmqLf.cn
http://pYfyswNk.rmqLf.cn
http://mHmirO0F.rmqLf.cn
http://E7FVGwUJ.rmqLf.cn
http://sYFRsMva.rmqLf.cn
http://mjNlEA1z.rmqLf.cn
http://xzjeedd2.rmqLf.cn
http://1c9BAePs.rmqLf.cn
http://5B9wVMcI.rmqLf.cn
http://www.dtcms.com/a/371342.html

相关文章:

  • redis学习——七
  • nginx反向代理不转发静态文件的解决办法
  • Webassemly和声明宏的联合使用
  • 选拔考试复现
  • 【Linux】 进程控制
  • C++ 连接 Redis:redis-plus-plus 安装与使用入门指南
  • K8s访问控制(二)
  • PerfTest:轻量高性能压测工具,兼容 HTTP/1/2/3、WebSocket,并带实时监控
  • 【Linux基础】fdisk命令详解:从入门到精通的磁盘分区管理完全指南
  • 【从零开始学习Redis】秒杀优化——阻塞队列、消息队列实现异步秒杀
  • 【基于深度学习的中草药识别系统】
  • AI 驱动数据分析:开源 SQLBot 项目探索,基于大模型和 RAG 实现精准问数与图表挖掘
  • 延迟 队列
  • 宋红康 JVM 笔记 Day14|垃圾回收概述
  • 【ICCV2025】计算机视觉|即插即用|ESC:颠覆Transformer!超强平替,ESC模块性能炸裂!
  • 手机能看、投屏 / 车机不能看与反向链接验证类似吗?
  • Xilinx ZYNQ 开发环境中搭建 Qt 环
  • leetcode909.蛇梯棋
  • JAVA NIO学习笔记基础强化学习总结
  • 基于51单片机手机无线蓝牙APP控制风扇调速设计
  • 力扣hot100:相交链表与反转链表详细思路讲解(160,206)
  • 如何在 DevOps 管道中实现 AI?
  • 【Java基础07】面向对象进阶
  • 动态维护有效区间:滑动窗口
  • 桌面时间 Catime
  • 解锁服务器网络配置新姿势:Wisdom SSH 助力之旅
  • 设计模式:状态模式(State Pattern)
  • 【ARM基础知道】
  • SpringCloud Alibaba微服务--Gateway使用
  • 基于脚手架微服务的视频点播系统-播放控制部分