设为首页 收藏本站
查看: 934|回复: 0

[经验分享] PHP7 opcache缓存清理问题

[复制链接]
累计签到:2 天
连续签到:1 天
发表于 2018-12-13 11:21:28 | 显示全部楼层 |阅读模式
PHP7 opcache缓存清理问题


背景
OPcache通过opcode的缓存和优化,提供更快的PHP执行过程。
业务在php7环境运营时,为了提升请求的性能,在PHP7环境中配置OPcache扩展。
业务在更新代码后,访问业务系统时提示无法找到对应的文件或请求的内容还是更新前的旧内容,
webserver重启以后,请求访问到的文件就都是最新的了,问题就貌似解决了。



问题分析
根据现象分析,代码更新后请求找不到新增的文件,尤其是还在请求已有文件更新前的内容,那么可能跟缓存有关系,考虑到跟业务代码逻辑无关,关闭opcache的配置问题就不再出现,基本上可以定位到问题出在opcache的配置上。



cat /usr/local/php/etc/subconfig/opcache.inizend_extension=opcache.soopcache.enable=1opcache.revalidate_freq=0opcache.validate_timestamps=0opcache.max_accelerated_files=7963opcache.memory_consumption=192opcache.interned_strings_buffer=16opcache.fast_shutdown=1opcache.enable_cli=1
opcache.enable 启用操作码缓存,默认为“1”

如果禁用此选项,则不会优化和缓存代码。 在运行期使用 ini_set() 函数只能禁用 opcache.enable 设置,不可以启用此设置。 如果在脚本中尝试启用此设置项会产生警告。

opcache.enable_cli  仅针对 CLI 版本的 PHP 启用操作码缓存。
通常被用来测试和调试。
opcache.revalidate_freq=0  检查脚本时间戳是否有更新的周期,以秒为单位。
设置为 0 会导致针对每个请求, OPcache 都会检查脚本更新。

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

如果禁用此选项,你必须使用 opcache_reset() 或者 opcache_invalidate() 函数来手动重置 OPcache,也可以 通过重启 Web 服务器来使文件系统更改生效。


最初的配置是:
opcache.revalidate_freq=60,opcache.validate_timestamps=1
即每60秒检测一次更新字节码缓存,业务代码更新后可能需要60秒以后才能访问到最新的内容,也就出现了最初访问不到新增的内容。



代码更新方式
php代码的更新方式有两种,一种是覆盖webserver配置的目录下的文件来更新,一种是每次都部署一个全量包目录,然后软链接到webserver指定的目录。
第一种覆盖更新的方式,如果使用在过期时间后自动清理opcache缓存内容的话,更新操作如果有延迟,就会出现新旧代码文件混合在一起的情况。
第二种全量包目录发布后,软链接到webserver指定路径的方式,虽然不会存在新旧文件混合的问题,但是在未自动清理时,即便webserver已经链接到webserver对应目录,业务访问的还是旧文件。


代码缓存的问题
目前使用rsync同步目录文件的方式是我们更新代码的主要方式,最初使用每60s定时清理opcache的缓存文件,在60s内更新的文件不会生效,就导致了业务反馈代码更新后访问不到的问题。

使用定时更新代码缓存的问题,还有更新文件较多时,代码文件发布的过程中缓存发生更新,将会有60s新旧文件的缓存混合存在的问题。

根据相关研究人员推荐,如果采用覆盖更新代码文件时,更新操作完毕后,手动清理缓存比较合适。
opcache.validate_timestamps=0 即,将oopcache.validate_timestamps设置为0。

配置了opcache.validate_timestamps值为0,必须手动清空Zend OPcache缓存的字节码,才能访问到最新的文件内容。适合在生产环境中设置为0,但在开发环境会带来不便,可以在开发环境中这样配置启用自动验证缓存功能:

opcache.validate_timestamps=1
opcache.revalidate_freq=0


手动清理缓存
除了重启php-fpm的进程可以清理opcache缓存外,
手动清理缓存涉及到的opcache函数主要为:opcache_reset()和opcache_invalidate() 。


boolean opcache_reset ( void )
该函数将重置整个字节码缓存。
在调用 opcache_reset() 之后,所有的脚本将会重新载入并且在下次被点击的时候重新解析。需要注意的是,当PHP以PHP-FPM的方式运行的时候,opcache的缓存是无法通过php命令进行清除的,只能通过http或cgi到php-fpm进程的方式来清除缓存。


In some (most?) systems,
PHP's CLI has a separate opcode cache to the one used by the web server ,
or PHP-FPM process,which means running opcache_reset() in the CLI,
won't reset the webserver/fpm opcode cache, and vice-versa.曲线救国,使用命令行清理php-fpm的opcache缓存:


#!/bin/bashcgi-fcgi -v  > /dev/null 2>&1|| yum --enablerepo=epel install fcgi -y  > /dev/null 2>&1echo '

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-650896-1-1.html 上篇帖子: 兽哥手打 下篇帖子: CentOS7 Xapian 1.2 安装 PHP绑定
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表