Laravel 5.2 .env有时不会及时加载

时间:2016-05-04 09:26:11

标签: laravel configuration laravel-5

我正在从.env文件中读取一些配置文件。这些可配置项用于项目中的各个位置。有几次我收到一个异常,其中一个env变量不存在。例如:

ini_set(): It is not safe to rely on the system's timezone settings. You are required to use the date.timezone setting or the date_default_timezone_set() function.

在我的.env中我有这个:

TIMEZONE=Africa/Johannesburg

在我的AppServiceProvider的启动功能中,我有:

ini_set('date.timezone', getenv('TIMEZONE'));

当我尝试使用其中一个变量时,好像.env还没有加载?我已经看到在应用程序运行期间的各个阶段发生了几个不同的.env变量。

修改

我知道使用config来设置时区,但在这个特定的实例中我必须使用.env文件,因为我们有一个开发团队负责我们指向的服务器+我们需要一个支持故障转移,而不是&# 39; t需要开发人员的干预才能指向另一台服务器。所以我需要知道为什么Laravel似乎在加载.env" in-time"而不是解决方法。

2 个答案:

答案 0 :(得分:0)

这不是Laravel的错误。

您应该在php.ini文件中设置一个默认的date.timezone,它会处理您的警告。

最重要的是,不要在AppServiceProvider中执行ini_set,而是使用

'timezone' => env('TIMEZONE', '[whatever default value you want]'),
config/app.php

中的

答案 1 :(得分:-1)

在同一个项目中,我们最近开始运行一些并发的AJAX请求。这个问题表现了10倍,但与此同时让我从不同的角度思考。然后我用Googled" Laravel多个AJAX请求错误"并发现了这个:Laravel 5 losing sessions and .env configuration values in AJAX-intensive applications

看到这让我意识到我有完全相同的问题。这不是我使用.env作为"可配置的"这实际上是2个相似但具有相同核心问题的问题:文件读/锁定访问。我的会话也在进行,因为我们的应用程序中没有DB访问权限,因此我们非常依赖于从会话变量(文件系统)存储和检索数据。虽然我不确定该问题是否与锁定文件有关。

我在整个应用程序中使用了getenv()很多,如果一个AJAX请求同时运行,基本的HTTP调用有时会失败,因为.env处于锁定状态,我猜不到。 / p>

我的解决方案是创建一个在我的AppServiceProvider中触发的单例,并将.env数据和我的会话数据存储在对象(内存)中。我的理论是,一旦文件被打开/关闭,即使请求仍然很忙并且文件中的另一个HTTP请求已经关闭。从那里开始,我从单身人员访问我的所有.env变量和会话数据。现在,在极少数情况下问题仍然存在。

我确定会出现的下一个问题是当我们有太多并发用户加载.env时,我会处理它。

<强>更新

我决定编写自己的脚本,打开并读取.env的内容。不是单一的问题,因为......正如我在链接帖子中强调的那样,Lance Vucas的PHP dotenv似乎在重大的AJAX驱动项目上存在问题。它可能是影响此插件的核心PHP问题。

我也没有因为明显的会话问题而改变任何东西,并且自从实现我自己的脚本后,会话问题也消失了......

相关问题