犯蠢日记(一)线上环境重新 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 协议》,转载必须注明作者和本文链接
推荐文章: