Laravel 5.2 没有读取 env 文件

Laravel 5.2 not reading env file

升级到 Laravel 5.2 后,正在读取我的 .env 个文件值中的 none 个。我跟着upgrade instructions; none 我的配置文件已更改,但 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)

显然没有引入我的环境配置。这影响了我的每一个配置文件,包括第三方,如 bugsnag。

我也试过了

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 个工作正常的项目。

哇。好伤心。这是因为我有一个带有 space 的 env 值,没有被引号包围

这个

SITE_NAME=My website

改成了这个

SITE_NAME="My website"

已修复。我认为这与 Laravel 5.2 现在将 vlucas/phpdotenv 从 1.1.1 升级到 2.1.0

有关

如果您的任何 .env 变量包含白色 space,请确保将它们用双引号引起来。例如:

SITE_NAME="My website"

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

php artisan config:cache
php artisan config:clear

来自官方Laravel 5.2升级说明:

If you are using the config:cache command during deployment, you must make sure that you are only calling the env function from within your configuration files, and not from anywhere else in your application.

If you are calling env from within your application, it is strongly recommended you add proper configuration values to your configuration files and call env from that location instead, allowing you to convert your env calls to config calls.

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

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

Add an env configuration option to your app.php configuration file that looks like the following: 'env' => env('APP_ENV', 'production')

添加此行可以正确读取本地 .env 文件。

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

php artisan config:clear
php artisan optimize

除@andrewtweber 建议之外,还请确保 KEY=value 之间没有空格,除非它在引号之间

.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. php artisan config:clear
  2. php artisan config:cache
  3. 然后取消phpartisan服务命令,然后重新启动。

如果您在本地开发期间确实调用了 config:cache,您可以通过删除 bootstrap/cache/config.php 文件来撤消此操作。这对我有用。

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

sudo chmod g+r .env

根据您的权限结构进行修改。

我在 index.php 文件中执行 dd/die/dump 时犯了错误。这会导致系统不重新生成配置。

只需在视图文件中转储即可。 .env 文件的更改会立即更新。

同样的事情发生在 :port 在你本地的 .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 文件。并更改凭据。这对我有用。请不要删除此文件,因为它可能包含生产环境中的其他重要数据。

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

以上几乎都试过了。结束了

chmod 666.env

有效。这个问题似乎不断出现在我继承的应用程序上,但是,最近一次是在添加 .env.testing 之后。 运行 Laravel 5.8

您可以通过以下推荐解决问题

建议1:

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

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

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

建议 3:更改任何配置或环境值后保持以下命令序列。

 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:当syntax1不工作时,你可以尝试另一种syntax2

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

建议5:当你的用户数是high/more那么你就要增加相关的内存大小服务器配置.

建议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 文件。

我不得不 - 停止我的 docker - 使用 chown 为我自己的用户设置整个项目的所有权 - 再次开始 docker

这次成功了。

如果您在更改环境变量后立即使用 sail 环境,只需重新启动服务器,否则它将显示旧值。

在我的例子中 (Laravel 7.x) 发生这种情况是因为我在服务器上设置了环境变量。准确地说是在 Docker 容器中。 并且由于环境变量的优先级高于 .env 文件,因此在 .env 文件编辑期间没有任何变化。

检查您是否在服务器上设置了环境变量:

echo $VAR_NAME

就我而言,我需要重新启动我的 Supervisord 作业(即我的队列工作人员)。这样做之后,我添加到我的 .env 文件中的新环境变量已成功拉入我的应用程序。

Remember, queue workers, are long-lived processes and store the booted application state in memory. As a result, they will not notice changes in your code base after they have been started. So, during your deployment process, be sure to restart your queue workers. In addition, remember that any static state created or modified by your application will not be automatically reset between jobs.

来源:Official Laravel Docs - Queues