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 系统中安装 bash # 基于 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 <?php print_r(opcache_get_status()); ?> ##### 命令行查看状态 bash 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 <?php opcache_reset(); ?> ##### 通过命令行重置 php php -r "opcache_reset();" ##### 通过 Web 请求触发 bash 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 |

后续补充

...

相关推荐
王嘉俊9256 个月前
初识JVM
java·jvm·字节码
trayvontang1 年前
JVM字节码与局部变量表
反编译·字节码·javap·局部变量表·java字节码·字节码执行示例·字节码执行
一叶飘舟1 年前
ASM插桩——动态添加字段并生成get set 方法
java·数据库·字节码·插桩
一叶飘舟1 年前
ASM之FieldVisitor创建变量
字节码·插桩
hummhumm1 年前
第七站:Java彩虹桥——跨平台开发的奇迹
java·开发语言·spring boot·spring cloud·java-ee·跨平台·字节码
JellyfishMIX1 年前
获取泛型,泛型擦除,TypeReference 原理分析
jvm·反射·字节码·java泛型
一叶飘舟1 年前
使用ASM动态创建接口实现类
java·字节码·插桩
w风雨无阻w1 年前
探索Java的DNA-JVM字节码深度解析
java·开发语言·jvm·字节码
夜夜流光相皎洁_小宁1 年前
Java 汇编源码查看环境搭建
java·开发语言·汇编·jvm·字节码