OPcache是PHP的一个核心扩展,它的主要目的是提高PHP应用程序的性能。其工作原理和在PHP项目中的应用方法如下:

OPcache原理

  1. 解析与编译阶段跳过: PHP脚本在执行前通常需要经过解析(Parse)和编译(Compile)两个阶段。解析阶段是将PHP代码转换为抽象语法树(AST),编译阶段则将AST转换为可执行的opcode(操作码),这是一种中间表示形式。OPcache的作用在于,它会将这个编译后的opcode缓存到共享内存中。当相同的PHP脚本下次被请求时,可以直接从共享内存中加载opcode并执行,跳过了耗时的解析和编译步骤。
  2. 减少磁盘I/O: 由于opcode存储在共享内存中,这减少了对磁盘上PHP脚本文件的读取需求,从而降低了磁盘I/O操作,提升了执行效率。
  3. 预加载(Preloading): OPcache还支持预加载功能,允许在Web服务器启动时或通过命令行预先将整个应用或部分常用脚本加载到内存中。这意味着即使在第一次请求到达之前,代码就已经准备就绪,进一步缩短了响应时间。

在PHP项目中的应用

  1. 安装与启用
  • 对于大多数现代PHP发行版,OPcache通常是默认内置的。你需要在php.ini配置文件中启用它,通过设置zend_extension=opcache.so(Linux环境下)或zend_extension=php_opcache.dll(Windows环境下)来指定OPcache扩展的位置。
  • 启用OPcache后,还需要配置一些基本选项,如opcache.enable=1来开启OPcache,以及根据需要调整缓存大小、过期时间等。
  1. 配置优化
  • 根据项目实际情况调整opcache.memory_consumption(OPcache内存分配量)、opcache.max_accelerated_files(能缓存的最大文件数量)、opcache.revalidate_freq(检查脚本是否更新的频率)等参数。
  • 开启文件预加载功能,可以使用opcache.preloadopcache.preload_user指定预加载的脚本文件路径。
  1. 监控与管理
  • 使用opcache_get_status()函数或通过opcache_reset()等函数来获取OPcache状态信息或手动重置缓存。
  • 可以编写脚本定期清除或更新OPcache,特别是在代码更新之后,确保新代码能够被正确加载。
  1. 问题排查
  • 如果遇到问题,比如更新的代码没有生效,可能需要检查是否正确配置了OPcache的重新验证策略,或者手动清除OPcache。

通过以上方式,OPcache能够显著提升PHP应用的执行效率,尤其是在高访问量的生产环境中。正确配置和利用OPcache是提升PHP项目性能的关键措施之一。

开启opcache 后 ,每次发布代码都需要 清空OPcache

开启OPcache后,每次发布新代码时,理论上确实应该清空OPcache,以确保新的代码更改能够立即生效。因为OPcache会将编译后的opcode缓存在内存中,如果不清除,PHP可能会继续使用旧的opcode,导致你看到的不是最新的代码逻辑。

有几种方法可以处理这个问题:

  1. 手动清空:你可以通过运行opcache_reset();这个PHP函数来手动清空OPcache。你可以在代码部署流程的最后加入一个脚本执行这个操作,或者通过访问一个特定的URL(如果设置了这样一个维护页面的话)。
  2. 自动化部署脚本:在持续集成/持续部署(CI/CD)流程中,可以集成清空OPcache的命令作为一个部署步骤。
  3. 配置自动刷新:OPcache提供了一些配置选项来帮助管理代码更新时的缓存刷新问题,例如opcache.validate_timestampsopcache.revalidate_freqopcache.validate_timestamps=1(默认开启)会让OPcache检查文件的修改时间来决定是否重新编译。而opcache.revalidate_freq设置检查间隔时间。但请注意,依赖这些设置可能不如直接清空OPcache来得直接有效,特别是对于频繁更新的环境。
  4. 使用预加载(Preloading)与预加载清单:如果你使用了预加载功能,并且有明确的预加载清单(preload script),确保在部署新版本时也更新这个清单,并重新执行预加载过程,以确保新代码被正确地预加载到内存中。

综上所述,虽然不总是强制要求每次发布都清空OPcache,但为了确保代码变更立即生效,清空OPcache是一个推荐的做法。


欢迎关注公-众-号【TaonyDaily】、留言、评论,一起学习。

Don’t reinvent the wheel, library code is there to help.

文章来源:刘俊涛的博客


若有帮助到您,欢迎点赞、转发、支持,您的支持是对我坚持最好的肯定(^_^)