犯蠢日记(一)线上环境重新 config:cache 后 .env 文件的更改还是不生效

背景

  • 本文的线上环境是本人的个人项目,非公司项目,所以一些操作很随意。
  • 本人前几天在线上环境配置了 OPcache 以提高性能,其中,opcache.validate_timestamps=0,因此每次更新代码需要手动清除 OPcache。
  • 项目缓存驱动配置(CACHE_DRIVER)是默认的 file。

正文

今天就觉得文件形式的缓存不太好,缓存文件数过多,感觉缓存过期了也并不会自动清理(没去详细了解),所以就考虑用 redis 来替代。

本地环境测试,更改 .env 文件:

CACHE_DRIVER=redis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=123456
REDIS_PORT=6379

接口调用测试,完美,缓存在 redis 里,并且 redis 本身支持设置过期时间,过期了就自动清除了,不占用多余的空间。

接下来到线上配置,更改完 .env 文件,我自然是记得需要重新缓存一下配置的:

$ php artisan config:cache

好,接口调用测试一下。。。???不生效?!缓存不在 redis 里,依旧还是文件缓存,怎么回事?
难道是旧的配置缓存还在?没理由啊,算了,先清除一下看看:

$ php artisan config:clear

接口调用测试。。。见鬼,还真可以了,算了,重新生成配置缓存吧,然后可以收工了,php artisan config:cache 执行。
保险起见,再调接口测一下。。。???怎么又不生效了??redis里怎么又没有缓存记录了?见鬼了,我就不信邪了,继续搞。

于是反反复复尝试各种操作,得出结论,只要一缓存了配置(config:cache 或 包含了配置缓存的 optimize),.env 里的更改就会不生效,最奇葩的是,我在本地环境里不管我怎么花式缓存配置,也无法重现问题,一回到线上就又不行了,真是百思不得其解,到处搜索后也没见别人有类似情况。

冷静了一下,决定重头梳理一下问题:

  • .env 文件修改了,线上环境 config:cache 后无法读取 .env 的修改,config:clear 时才能读取,重新 config:cache 也不行。
  • 本地无法重现问题,只在线上出现,说明问题原因可能出在本地跟线上的开发环境差异上,这就有点多了,一步步梳理。
  • 先思考 config:cache 做了什么,才能知道什么环境差异会有影响。
  • config:cache 应该是读取 .env 文件的内容后,将 config 目录里的所有配置文件的 env() 调用都填充好,然后生成一份缓存的配置文件。。。。等等!生成的这份缓存的配置文件应该是 php 文件!我好像知道了问题出在哪里!

我意识到了本地环境跟线上环境的一个区别是 OPcache,线上配置了 OPcache,但是由于这次更新没有涉及到 php文件,所以我没有手动清除 OPcache,问题可能就是出在这里了。
验证猜想:

$ php artisan opcache:clear
$ php artisan optimize
$ php artisan opcache:optimize

接口调用测试,终于成功了。。缓存出现在 redis 里了。。。瞬间差点被自己蠢哭,一个小小的改动都能耗费这么长的时间,果然还是太年轻,于是决定编写此文记录一下自己的犯蠢时刻,保证下次不能再犯。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 5
Shuyi

去tinker里面写 config('database.redis') , config('cache'), 看出来的结果对不对

6年前 评论
Destiny

不瞒你说。你这问题我之前也遇见过。当时以为闹鬼了哈哈哈哈。cache 缓存形成的文件全被 opcache 给缓存了。

6年前 评论

@Shuyi tinker 里面的结果是对的,因为 tinker 并不会读取 OPcache 的缓存

6年前 评论
Shuyi

@xinhuo Tinker读缓存的,亲测过,做 cache:clear 前后,tinker上面config的值会变

6年前 评论

@Shuyi 我的意思是 Tinker 不读取 OPcache 的缓存,不是不读取 config:cache 的缓存

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!