解决PHP Opcache 缓存刷新、代码重载出现无法更新代码的问题


Posted in PHP onAugust 24, 2020

问题背景

通过启用Opcache的缓存优化,将PHP代码预编译为Opcode缓存到共享内存中供进程反复调用,从而减少了重复从磁盘解析PHP代码的时间消耗,显著的提高了PHP性能,提升了业务性能的调用,但是也引发了一些问题,就是我们每次更新了相应的PHP代码后,web server 无法即时加载到更新后的代码。

解决方案

(一)、设置Opcache脚本验证时间

可以通过更改 Opcache 以下两个配置选项来调整代码重载时间

opcache.revalidate_freq=0 检查脚本时间戳是否有更新的周期,以秒为单位。(如果设置为 0 会导致针对每个请求, OPcache 都会检查脚本更新)

opcache.validate_timestamps=0 如果启用,那么 OPcache 会每隔 opcache.revalidate_freq 设定的秒数 检查脚本是否更新。

PS:在实际生产环境中,为了尽可能达到最优性能,尽量不开启文件更新验证,因为每次验证都会重新预编译PHP代码到共享内存中。

(二)、重启 | 重载 php-fpm 进程

每次重启或重启 php-fpm 进程便会重新解析PHP脚本文件,但是重启 fpm 进程可能会导致请求中断,从而导致写入脏数据 或者 造成事务回滚等一系列异常。

重载相对于重启则平顺很多,不会导致用户请求直接中断,相对来说风险低很多,但是php-fpm 收到reload信号,便会向所有子进程发送SIGGUIT信号,同时注册一个定时器,在规定的时间之内子进程没有退出,接着在发送SIGTERM信号,结束子进程。如果在一秒之内子进程还是没结束 直接发送SIGKILL 强制杀死。

重启php-fpm

service php-fpm restart

重载php-fpm

services php-fpm reload

或 kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`

(三)、手动清理缓存

除了上面的两种方式,还有更为稳妥一点的缓存清理,我们可以通过opcache_reset()和opcache_invalidate() 函数来刷新Opcache缓存。

opcache_reset() - 重置整个Opcode缓存,所有的PHP脚本将会被重新解析再预编译为Opcode。

opcache_invalidate() - 清除指定脚本缓存,可以传递两个参数,一个是刷新文件路径,一个是force字段, 如果 force 没有设置或者传入的是 FALSE,那么只有当脚本的修改时间 比对应Opcode的时间更新时,脚本的缓存才会失效。

需要注意的是,当PHP以PHP-FPM的方式运行的时候,opcache的缓存是无法通过php命令进行清除的,只能通过http或cgi到php-fpm进程的方式来清除缓存,我们可以编写一个对外接口,来达到清理缓存的目的。

相关实现如下(框架:laravel):

Route::any('cache-reset', function () {
  //重置整个Opcode缓存
  dd(opcache_reset());
});

Route::any('cache-update', function () {
  //清除掉最近一次更新文件的缓存
  exec('git diff --name-only HEAD~ HEAD', $output);
  foreach ($output as $file) {
    $path = base_path($file);
    opcache_invalidate($path, true);
  }
  dd('刷新完成');
});

总结

通过上面的三种策略,可以实现 Opcache 缓存更新的目的,但是在流量高峰期或者大流量的服务端,每次更新缓存都是一件非常损耗资源的事情,Opcache在重建缓存时,也不会禁止其他进程读取,因此就会造成反复新建缓存,因此想要达到最佳的性能调配:

  • 最好不要在高峰期清理缓存
  • 高峰期不要频繁的更新代码,清理缓存,会造成重复新建缓存
  • 如果需要更新,可以尝试削弱服务端权重,实现逐个更新的目的。
  • 如果需要强制更新,尽量选择手动清除缓存的方式,来重建Opcache缓存,使代价最小化。

以上就是解决PHP Opcache 缓存刷新、代码重载出现无法更新代码的问题的详细内容,更多关于PHP Opcache 缓存刷新、代码重载的资料请关注三水点靠木其它相关文章!

PHP 相关文章推荐
PHP 处理图片的类实现代码
Oct 23 PHP
smarty模板中使用get、post、request、cookies、session变量的方法
Apr 24 PHP
PHP对象相互引用的内存溢出实例分析
Aug 28 PHP
Sublime里直接运行PHP配置方法
Nov 28 PHP
php计算两个日期相差天数的方法
Mar 14 PHP
Ajax PHP JavaScript MySQL实现简易无刷新在线聊天室
Aug 17 PHP
PHP数据对象PDO操作技巧小结
Sep 27 PHP
基于PHP实现栈数据结构和括号匹配算法示例
Aug 10 PHP
php爬取天猫和淘宝商品数据
Feb 23 PHP
php微信公众号开发之微信企业付款给个人
Oct 04 PHP
PHP将整数数字转换为罗马数字实例分享
Mar 17 PHP
phpStorm2020 注册码
Sep 17 PHP
WordPress免插件实现面包屑导航的示例代码
Aug 20 #PHP
VSCode+PHPstudy配置PHP开发环境的步骤详解
Aug 20 #PHP
Laravel相关的一些故障解决
Aug 19 #PHP
聊聊 PHP 8 新特性 Attributes
Aug 19 #PHP
php提高脚本性能的4个技巧
Aug 18 #PHP
php判断IP地址是否在多个IP段内
Aug 18 #PHP
PHP 8新特性简介
Aug 18 #PHP
You might like
坏狼的PHP学习教程之第1天
2008/06/15 PHP
php radio 单选框获取与保持值的实现代码
2010/05/15 PHP
php购物车实现代码
2011/10/10 PHP
PHP+Ajax异步通讯实现用户名邮箱验证是否已注册( 2种方法实现)
2011/12/28 PHP
实例详解PHP中html word 互转的方法
2016/01/28 PHP
CSS+Jquery实现页面圆角框方法大全
2009/12/24 Javascript
jQuery下通过$.browser来判断浏览器.
2011/04/05 Javascript
六款帮助你实现惊艳视差滚动效果的jQuery插件
2012/09/14 Javascript
js jquery验证银行卡号信息正则学习
2013/01/21 Javascript
jquery分页插件AmSetPager(自写)
2013/04/15 Javascript
使用jQuery仿苹果官网焦点图特效
2014/12/23 Javascript
Backbone.js的一些使用技巧
2015/07/01 Javascript
微信支付如何实现内置浏览器的H5页面支付
2015/09/25 Javascript
JavaScript中${pageContext.request.contextPath}取值问题及解决方案
2016/12/08 Javascript
利用Jquery实现几款漂亮实用的时间轴(附示例代码)
2017/02/15 Javascript
基于vuejs实现一个todolist项目
2017/04/11 Javascript
vue中子组件向父组件传递数据的实例代码(实现加减功能)
2018/04/20 Javascript
react native 获取地理位置的方法示例
2018/08/28 Javascript
angular 实时监听input框value值的变化触发函数方法
2018/08/31 Javascript
ES6 更易于继承的类语法的使用
2019/02/11 Javascript
Vue.js特性Scoped Slots的浅析
2019/02/20 Javascript
[01:07:46]完美世界DOTA2联赛循环赛 Magma vs IO BO2第二场 11.01
2020/11/02 DOTA
Django中几种重定向方法
2015/04/28 Python
浅谈Python中列表生成式和生成器的区别
2015/08/03 Python
在Python的while循环中使用else以及循环嵌套的用法
2015/10/14 Python
Python中的if、else、elif语句用法简明讲解
2016/03/11 Python
深入理解Django中内置的用户认证
2017/10/06 Python
python实现超简单的视频对象提取功能
2018/06/04 Python
Python使用爬虫抓取美女图片并保存到本地的方法【测试可用】
2018/08/30 Python
python模拟实现分发扑克牌
2020/04/22 Python
Python中zipfile压缩文件模块的基本使用教程
2020/06/14 Python
CSS3 transform的skew属性值图文详解
2014/07/21 HTML / CSS
包装类的功能、种类、常用方法
2012/01/27 面试题
制衣厂各岗位职责
2013/12/02 职场文书
个人委托书范文
2015/01/28 职场文书
销售合作意向书范本
2015/05/08 职场文书