【问题标题】:Laravel 5.2 .env sometimes doesn't load in timeLaravel 5.2 .env 有时无法及时加载
【发布时间】:2016-08-29 15:35:36
【问题描述】:

我正在从我的 .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 文件,因为我们有一个开发运营团队负责我们指向哪些服务器 + 我们需要一个支持故障转移无需开发人员干预即可指向另一台服务器。所以我需要知道为什么 Laravel 似乎在“及时”加载 .env 而不是解决方法方面存在问题。

【问题讨论】:

  • 如果你要降价至少解释一下,否则你的意图会被认为是恶意和懦夫。

标签: laravel configuration laravel-5


【解决方案1】:

这并不是真正的 Laravel 错误。

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

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

'timezone' => env('TIMEZONE', '[whatever default value you want]'),

config/app.php

【讨论】:

  • 我知道 Laravel 的配置,但我不能在这种情况下使用它。我们的环境有特定的原因需要在 .env 中设置时区。这个时区示例只是一个不从 .env 加载的可配置示例,因此这不是解决我的问题的方法,而是另一种我无法使用的解决方案。
  • 这并没有改变 date.timezone 在你的 php.ini 中应该有一个默认值的事实,你的例子是当你没有时你会得到的特定错误消息。我想我确实在本地开发人员之前看到过您的问题,env 值在更改时会返回旧值,就好像它们已被缓存一样。这是你看到的吗?
  • 有时它好像 .env 没有被及时读取,并且一个空白值被传递给 AppServiceProvider 内的 ini_set() 并引发 Laravel 异常。由于 php.ini 设置,时区可能不是最好的例子,但这个问题也出现在其他自定义 .env 变量中。例如,我们有另一个变量声明为:MSISDN_PREFIX=0027,它有时也没有“加载”并且我们的一些脚本中断。此问题可能会在 50 个页面加载中出现 1 个。
  • 环境在启动时只读一次,除非它被缓存。你使用配置缓存吗? (这仍然不能解释 50 中的 1)或者您是否有代码在启动应用程序时以任何方式修改 env 文件或路径?不确定它是否与 Laravel 或 Dotenv 相关。
  • 我发现了问题,如果你好奇的话,我会发布答案。
【解决方案2】:

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

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

我在整个应用程序中经常使用 getenv(),如果 AJAX 请求同时运行,因为我猜想 .env 处于锁定状态,基本的 HTTP 调用有时会失败。

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

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

更新

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

我也从未对明显的会话问题进行任何更改,并且自从实施我自己的脚本以来,会话问题也消失了......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    • 2020-05-02
    • 2017-06-10
    • 2021-01-20
    • 2021-04-08
    • 1970-01-01
    • 2016-03-29
    相关资源
    最近更新 更多