我使用Laravel 5.0.33,我的服务器上有以下文件夹:
/var/www/laravel_dev/
/var/www/laravel_stage/
/var/www/laravel_production/
他们每个人都有自己的.env文件和数据库,但由于某种原因,他们每个人有时会加载错误的.env文件(比如每100个请求一次)。
我认为它加载了错误的.env文件,因为当我转储env数据库时:
var_dump(env('DB_DATABSE'));
有时会在laravel_dev网站上返回laravel_production数据库的名称。
我已经对laravel_production数据库名称进行了grep搜索,它不在dev文件夹中。
我有triede转储dir常量( DIR )各个地方,它总是正确的。
有没有人知道可能出错的地方,或者我如何进一步挖掘可能出错的地方?
答案 0 :(得分:1)
我最近遇到了这个问题,并想分享我在这里学到的东西,因为这是Bing / Google搜索中的最佳成果之一。
如果您在多线程Web服务器上运行此问题,可能会遇到此问题,直到有多人访问服务器时才会出现问题。
长话短说,使用Laravel使用的dotenv包不是线程安全的。你可以在这里看到关于它的讨论: https://github.com/vlucas/phpdotenv/issues/76
快速修复是运行:
artisan config:cache
我强烈建议在.env文件的顶部添加注释行:
# IMPORTANT! If you change ANYTHING in here make sure to run > artisan config:cache
我希望这会有所帮助。
答案 1 :(得分:0)
事实证明,dotevn仅适用于项目的开发实例。在生产中,配置文件必须是硬编码的。
https://github.com/vlucas/phpdotenv
“phpdotenv是为开发环境而制作的,通常不应该用于生产。在生产中,应该设置实际的环境变量,这样就不会在每个请求上加载.env文件。”
我在生产实例上使用git,所以我的问题解决方案是在每个vhost文件中为我需要的每个实例设置环境变量:
SetEnv DB_DATABASE laravel_stage
SetEnv CACHE_PREFIX stage
像魅力一样。