Laravel是否会缓存.env文件?同主域跨子域名请求返回陌生数据库错误
问题解答
关于Laravel是否缓存.env文件的说明
Laravel默认不会主动缓存.env文件,但当你执行php artisan config:cache命令后,会将包括.env变量在内的所有配置项合并生成统一的缓存文件存放在bootstrap/cache/config.php,此时应用将不再读取.env文件的内容,相当于间接缓存了.env的配置。
跨应用数据库配置错误问题根因
这个问题是共享主机部署多Laravel应用的典型故障,和.env缓存无关,本质是PHP-FPM环境变量污染:
共享主机上如果两个Laravel应用共用同一个PHP-FPM进程池,FPM进程是常驻的,当某个进程先处理了Dashboard应用的请求时,会将Dashboard的.env变量写入全局$_ENV/系统环境变量,同一个进程后续处理Form应用的请求时,旧的环境变量不会被清空,就会导致Form应用读到Dashboard的数据库配置,出现访问错误数据库的问题。
本地开发环境一般是单请求单进程的运行模式,不会出现环境变量复用的情况,因此本地运行完全正常。
可行的解决方案
- 联系共享主机服务商为两个应用分配独立的PHP-FPM进程池,完全隔离两个应用的运行环境,从根源解决环境变量污染问题
- 若无法调整FPM配置,分别在两个应用的根目录执行
php artisan config:cache生成配置缓存,Laravel读取缓存配置时不会依赖全局环境变量,也就不会读取到另一个应用的.env配置,注意每次修改.env文件后都需要重新执行该命令更新缓存 - 临时验证可以先清空两个应用
bootstrap/cache目录下的所有缓存文件,再重试请求,若问题暂时消失即可确认是环境变量污染导致的故障
内容的提问来源于stack exchange,提问作者Nazmul Hossain Nihal
相关产品推荐
相关产品推荐

