3

我使用 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 文件夹中。

我已经尝试将 dir 常量( DIR )转储到各个地方,它总是正确的。

有谁知道可能出了什么问题,或者我如何进一步挖掘可能出了什么问题?

4

2 回答 2

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

我希望这有帮助。

于 2016-05-13T17:49:08.040 回答
0

事实证明,dotevn 仅适用于项目的开发实例。在生产中,配置文件必须是硬编码的。

https://github.com/vlucas/phpdotenv

“phpdotenv 是为开发环境制作的,一般不应该在生产中使用。在生产中,应该设置实际的环境变量,这样就不会在每次请求时加载 .env 文件。”

我在生产实例上使用 git,所以我的解决方案是在每个 vhost 文件中为服务器上我需要的每个实例设置环境变量:

SetEnv DB_DATABASE laravel_stage
SetEnv CACHE_PREFIX  stage

奇迹般有效。

于 2016-01-20T09:46:43.890 回答