Laravel 5.2没有读取 env 文件

升级到 Laravel 5.2之后,没有读取我的 .env文件值。我使用了 升级指令; 除 auth.php 之外,没有更改任何配置文件。在之前的版本5.1.19中,它们都运行良好

.env包含如下值

DB_DATABASE=mydb
DB_USERNAME=myuser

config/database.php包含

'mysql' => [
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
]

我得到了这个错误:

PDOException: SQLSTATE[HY000] [1045] Access denied for user 'forge'@'localhost' (using password: NO)

显然没有输入我的 env 配置。这正在影响我的每一个配置文件,包括第三方,如 bug。

我也试过

php artisan config:clear
php artisan cache:clear

更新

正在尝试 php artisan tinker

>>> env('DB_DATABASE')
=> null
>>> getenv('DB_DATABASE')
=> false
>>> config('database.connections.mysql.database')
=> "forge"
>>> dd($_ENV)
[]

我尝试安装一个新的 Laravel 5.2副本。我基本上只复制了我的 app文件夹,没有额外的作曲家包包括在内。还是有同样的问题。在同一台服务器上,我还有其他 Laravel 5.2项目运行良好。

202824 次浏览

天哪,那是因为我的 env 值里有个空格,而不是被引号包围了

这个

SITE_NAME=My website

变成这样了

SITE_NAME="My website"

修正了这个问题。我认为这和 Laravel 5.2现在将 Vlucas/phpdotenv从1.1.1升级到2.1有关

如果您的 .env变量中有任何包含空格,请确保用双引号包装它们。例如:

SITE_NAME="My website"

不要忘记在测试前清除缓存:

php artisan config:cache
php artisan config:clear

来自官方的 Laravel 5.2升级说明:

如果在部署期间使用 config:cache命令,则 必须确保只从内部调用 env函数 您的配置文件,而不是从您的 申请。

如果从应用程序内部调用 env,则为强 建议您向配置中添加适当的配置值 文件,并从该位置调用 env,从而允许您转换 你的 env呼叫到 config呼叫。

参考资料: https://laravel.com/docs/5.2/upgrade#upgrade-5.2.0

我在升级说明中漏掉了这一点:

app.php配置文件中添加一个 env 配置选项,如下所示: 'env' => env('APP_ENV', 'production')

添加这一行可以正确地读入本地 .env文件。

我在 config/services.php中遇到过类似的问题,我用 config clearoptimize命令解决了这个问题:

php artisan config:clear
php artisan optimize

另外@andrewweber 建议确保在 KEY = 价值之间没有空格,除非是在引号之间

. env 文件例如:

...
SITE_NAME= My website
MAIL_PORT= 587
MAIL_FROM_NAME= websitename
...

致:

...
SITE_NAME="My website"
MAIL_PORT=587
MAIL_FROM_NAME=websitename
...

我使用命令 php artisan key:generate解决了生成新密钥的问题

我在当地环境方面也遇到了同样的问题

  1. 个人配置: 清除
  2. 缓存
  3. 然后取消 php Artisan 服务命令,并重新启动。

如果在本地开发期间调用了 config: cache,那么可以通过删除 bootstrap/cache/config.php 文件来撤消这个命令。这是我的工作。

原因是由于文件权限,apache (用户 www-data)无法读取. env。 因此,我更改了文件权限,以确保服务器(apache)具有对文件的读权限。就是这样,然后砰,现在一切都正常了!
更新: < br/> 如何做到这一点取决于谁拥有。Env 文件,但是假设它属于 Apache www-data组,您可以这样做:

sudo chmod g+r .env

根据您的权限结构修改它。

我错误地在 index.php文件中执行 dd/die/dump 操作,导致系统无法重新生成配置。

只要在视图中做文件转储就可以了。对 .env文件的修改立即更新。

当: port 位于 local.env 中时,也会发生同样的情况

双引号再次起作用

APP_URL="http://localhost:8000"

然后

php artisan config:clear

对我来说,它是这样运作的:

php artisan config:cache
php artisan config:clear
php artisan cache:clear

剩下的我都试过了,都没用。

如果在本地开发期间调用了 config: cache,那么可以通过删除 bootstrap/cache/config.php 文件来撤消这个命令。这是我的工作。

@ Payal Pandav 发表了上述评论。

我想说一个简单的解决办法。只需在 bootstrap/cache/文件夹中编辑 config.php 文件。还有更换证件。这招对我很管用。请不要删除该文件,因为它可能包含生产环境中的其他关键数据。

在我的情况下,幼虫5.7 env('APP_URL')不工作,但 config('app.url')工作。如果我添加新的变量到 env和配置-它不工作-但在 php artisan config:cache开始工作。

几乎尝试了以上所有方法,最后都成功了

Chmod 666. env

成功了。这个问题似乎不断出现在我继承的应用程序,然而,这最近一次是在添加了一个。测试。运行 Laravel 5.8

您可以通过以下建议来解决这个问题

建议1:

你必须使用。通过配置文件访问 env 文件,这意味着需要读取。来自配置文件(例如/config/app.php 或/config/database. php)的 env 文件,然后您就可以在项目的任何位置使用配置文件。

建议2: 在双引号内设置 env 值

 GOOGLE_CLIENT_ID="887557629-9h6n4ne.apps.googleusercontent.com"
GOOGLE_CLIENT_SECRET="YT2ev2SpJt_Pa3dit60iFJ"
GOOGLE_MAP="AIzaSyCK6RWwql0DucT7Sl43w9ma-k8qU"

建议3: 在更改任何配置或 env 值后维护以下命令序列。

 composer dump-autoload
composer dump-autoload -o


php artisan clear-compiled
php artisan optimize


php artisan route:clear
php artisan view:clear


php artisan cache:clear
php artisan config:cache
php artisan config:clear

建议4: 当语法1不工作时,可以尝试另一个语法2

   $val1 = env('VARIABLE_NAME');     // syntax1
$val2 = getenv('VARIABLE_NAME');  // syntax2
echo 'systax1 value is:'.$val1.' & systax2 value is:'.$val2;

建议5: 当你的用户数是 高度或以上时,你必须增加 服务器配置中相关的内存大小。

建议6: 在读取.env 变量时设置默认可能值。

 $googleClinetId=env("GOOGLE_CLIENT_ID","889159-9h6n95f1e.apps.googleusercontent.com");
$googleSecretId=env("GOOGLE_CLIENT_ID","YT2evBCt_Pa3dit60iFJ");
$googleMap=env("GOOGLE_MAP","AIzaSyCK6RUl0T7Sl43w9ma-k8qU");

我在这方面有些问题。 这似乎是应用程序中某个地方的文件权限问题,而不是. env-file。

我必须这么做 阻止我的码头 - 使用 chown 为整个项目设置我自己的用户的所有权 重新开始码头工作

这次成功了。

如果你在更改环境变量后立即使用帆环境,只需重新启动一个服务器,否则它就会显示旧的值。

在我的例子中(Laravel 7.x)发生这种情况是因为我在服务器上设置了环境变量。准确地说是在码头集装箱里。 而且由于环境变量的优先级比.env 文件高,因此在.env 文件编辑期间不会发生任何更改。

检查是否在服务器上设置了 env 变量:

echo $VAR_NAME

在我的例子中,我需要重新启动督导作业(即队列工作者)。这样做之后,一个新的环境变量,我已经添加到我的。成功地将 env 文件放入我的应用程序中。

请记住,队列工作器是长寿命进程,它将引导的应用程序状态存储在内存中。因此,它们在启动后不会注意到代码库中的更改。因此,在部署过程中,一定要重新启动队列工作程序。此外,请记住,应用程序创建或修改的任何静态状态都不会在作业之间自动重置。

资料来源: 官方 Laravel 文档-队列

在我的案例中,我使用的是 VSCODE,结果是我的 .env文件被 IDE 自动检测为一个 shell 脚本文件,而不是 Ini,这导致了我的问题。这种情况很少发生,但我希望它能节省一些人的时间。

我们可以使用 config ()来解决这个问题

在“ config/app.php”文件中:

'same_url' => env('SAME_URL', 'http://localhost'),

在你的代码库中:

$sameURL = config('app.same_url').'/orders/';