190

After upgrading to Laravel 5.2, none of my .env file values are being read. I followed the upgrade instructions; none of my config files were changed except auth.php. They were all working fine in the previous version, 5.1.19

.env contains values such as

DB_DATABASE=mydb
DB_USERNAME=myuser

config/database.php contains

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

I get this error:

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

Not pulling in my env config. This is affecting every single one of my config files, including third parties such as Bugsnag.

I also tried

php artisan config:clear
php artisan cache:clear

Update

Trying php artisan tinker

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

I have tried installing a fresh copy of Laravel 5.2. I only copied it into my app folder; no additional composer packages are included. I still have the same issue. Other Laravel 5.2 projects on the same server are working fine.

12
  • 1
    Are you sure the .env file is named only .env? Not .env.example? Commented Dec 22, 2015 at 16:54
  • Andrew are you editing the .env file by the forge interface or uploading it? Commented Dec 22, 2015 at 16:54
  • @JamesElliott yes it is .env Commented Dec 22, 2015 at 16:55
  • 1
    Or are you running this locally? If your running under artisan serve you need to restart it just in case that might be the case. Commented Dec 22, 2015 at 16:55
  • 1
    @MarkDavidson editing it through vi in the command line, and no it's on a full server Commented Dec 22, 2015 at 16:55

29 Answers 29

252

If any of your .env variables contains white space, make sure you wrap them in double-quotes. For example:

SITE_NAME="My website"

Don't forget to clear your cache before testing:

php artisan config:cache
php artisan config:clear
Sign up to request clarification or add additional context in comments.

3 Comments

Yes It's working. After Changing any value in .env file run the php artisan config:cache & php artisan config:clear command. It will work.
For Laravel8 use the same. In my special case only the "php artisan config:clear" was enough.
this helped me a lot.. I didnt know I should be running those config clears..
110

From the official Laravel 5.2 Upgrade Notes:

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.

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

6 Comments

php artisan config:cache solved it for me - nothing else had helped. Not even php artisan config:clear - thanks!
Laravel 5.3 php artisan config:clear is the only thing that worked for me
Laravel 5.4 - deployed on a VPS: php artisan config:clear worked for me. I didn't do config:cache before so it seemed a bit weird that I had to clear the cache.
make sure you're editing .env instead of .env.example file
|
75

For me it has worked this in this order:

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

And I've tried all the rests without luck.

1 Comment

I think this removes the bootstrap/cache/config.php then you are not caching the configuration, that fix the issue at least for me, but I do not think it will be the best.
47

Wow. Good grief. It's because I had an env value with a space in it, not surrounded by quotes

This

SITE_NAME=My website

Changed to this

SITE_NAME="My website"

Fixed it. I think this had to do with Laravel 5.2 now upgrading vlucas/phpdotenv from 1.1.1 to 2.1.0

3 Comments

Same think - seems like spaces causes issues in .env under 5.2 where as in 5.1 it didn't.
And this is one of my (many) bugbears with Laravel: it has a habit of sometimes silently ignoring and accepting a variety of configuration and/or other types of errors, with no indication anything has gone wrong. Given, this may be a "feature" of phpdotenv, but Laravel still knows there's a .env file that needs to be included, and that it wasn't successful, but doesn't bother to tell anyone.
I've already wasted hours on something so silly. Thank you for stopping me waste more!
30

You can solve the problem by the following recommendation

Recommendation 1:

You have to use the .env file through configuration files, that means you are requrested to read the .env file from configuration files (such as /config/app.php or /config/database.php), then you can use the configuration files from any location of your project.

Recommendation 2: Set your env value within double quotation

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

Recommendation 3: Maintain the following command sequence after changing any configuration or env value.

 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

Recommendation 4: When the syntax1 is not working then you can try another syntax2

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

Recommendation 5: When your number of users is high/more then you have to increase the related memory size in the server configuration.

Recommendation 6: Set a default probable value when you are reading .env variable.

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

4 Comments

Just wanted to add that it's a bad idea to add secrets to the code base (see recommendation 6).
This is not real client & secret id, I have given a draft information to make understand the solution finder. Thanks @Sherlock
That's not what I meant. If you're passing secrets as a second parameter to the env() method, that means you're adding these secrets to your repository, thus breaking the best practice not to include .env values in the repository.
please be careful: recommendation 6 is not a good practice
28

I had a similar issue in my config/services.php and I solved using config clear and optimize commands:

php artisan config:clear
php artisan optimize

1 Comment

Note that artisan optimize builds a number of caches, including the config cache, as in the accepted answer.
12

I missed this in the upgrade instructions:

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

Adding this line got the local .env file to be read in correctly.

1 Comment

I guess I got the same error, since my app was Laravel 4, then upgraded to 5.0, then to 5.1, etc. Probably missed adding this value in my app.php. Thanks for saving me a lot of time. Here's an upvote!
12

I had the same issue on local environment, I resolved by

  1. php artisan config:clear
  2. php artisan config:cache
  3. and then cancelling php artisan serve command, and restart again.

Comments

8

Same thing happens when :port is in your local .env

again the double quotes does the trick

APP_URL="http://localhost:8000"

and then

php artisan config:clear

Comments

5

I know this is super old, but today I discovered another reason why my .env was not loaded:

  • I had a (commited) .env.local
  • I recently switched APP_ENV from dev to local

With L8 (and maybe before), what happens is that it tries to find .env.<APP_ENV> and if it finds it, uses it.

Fun fact: in my case, .env.local was a blue-print file with non-sensitive information and not meant to be directly used, but that's what happened.

Removing the .env.local led to Laravel looking for .env instead.

Comments

4

In my case laravel 5.7 env('APP_URL') not work but config('app.url') works. If I add new variable to env and to config - it not works - but after php artisan config:cache it start works.

4 Comments

If you are on development enviroment you shouldn't cache your config and routes. To remove all cache you can use: php artisan optimize:clear
@ZohaibHassan How to turn off cache for config and routes on dev environment?
Above command will turn off 1. routes cache, 2 config cache, 3. clear views 4. clear optimized files 5. clear cache if any
For config only you can use php artisan config:clear it will clear your config cache and will not generate again and when you go on production you can run php artisan config:cache to cache your configurations
3

Also additional to what @andrewtweber suggested make sure that you don't have spaces between the KEY= and the value unless it is between quotes

.env file e.g.:

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

to:

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

Comments

3

if you did call config:cache during local development, you can undo this by deleting the bootstrap/cache/config.php file. and this is work for me.

Comments

3

I experienced this. Reason was that apache(user www-data) could not read .env due to file permissions. So i changed the file permissions to ensure that the server (apache) had read permissions to the file. Just that and boom, it was all working now!
Update:
How to do this varies, depending on who owns the .env file, but assuming it belongs to the Apache www-data group, you can do this:

sudo chmod g+r .env

Modify it depending on your permission structure.

1 Comment

So i changed the file permissions to ensure that the server (apache) had read permissions to the file. this is actually wrong approach. You should have fixed apaxhe config so it serves this particular site as owner that owns these files
2

I solved this problem generating a new key using the command: php artisan key:generate

1 Comment

Warning: DON'T do this in a already deployed site. Otherwise all the already encrypted data will not be accessible. Read first the Laravel documentation regarding data encryption before attempting this in production environments.
2

For anyone encountering issues with Laravel Valet where php artisan does not reflect updated .env variable values, consider using a unique naming convention for your environment variables as a workaround.

For instance, instead of using the default DB_USERNAME, rename it to DATABASE_USERNAME or another distinctive name. The root cause of the issue, where php artisan tinker still displays outdated values even after executing the commands:

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

is unclear. This workaround can help bypass the problem by ensuring your application references uniquely named environment variables, potentially avoiding conflicts or caching issues with commonly used names.

refer: https://laracasts.com/discuss/channels/general-discussion/env-not-reading-variables-sometimes

Comments

1

In my case, I needed to restart my Supervisord jobs (i.e. my queue workers). After doing so, a new environment variable I had added to my .env file was successfully pulled into my application.

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.

Source: Official Laravel Docs - Queues

Comments

1

If you've come here because you have multiple .env.* files and php artisan config:cache resulted in incorrect settings, it's because it (tried to) read the .env file and not the one specific to your environment. Try this instead (where CODE corresponds to .env.CODE):

APP_ENV=CODE php artisan config:cache

Comments

0

if you did call config:cache during local development, you can undo this by deleting the bootstrap/cache/config.php file. and this is work for me.

@Payal Pandav has given the comment above.

I want to tell a simple workaround. Just edit the config.php file in the bootstrap/cache/ folder. And change the credentials. This worked for me. Please don't delete this file since this may contain other crucial data in the production environment.

1 Comment

config.php is not there for rewriting. It is generated from the Env. That's the whole point of it.
0

In my case I was using VSCODE and it turned out my .env file was auto-dectected by the IDE as a shell script file and not an Ini which was causing me the issue. It's a rare occurrence, but I hope it will save someone time.

Comments

0

For Laravel coder. We can use config() to solve this problem

in file "config/app.php":

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

in your code base:

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

Comments

0

For those who run their php application in Docker it might help to run config:clear and then restart the container, so the worker processes restart as well (if they're configured to run inside the same container as the application)

Comments

0

Config clearing didn't work for me. I found that Laravel was prioritizing OS env variables over the .env file. Somehow, APP_ENV was added to OS (MacOS), and inside Laravel, the value of env('APP_ENV') was always local.

Unset OS variables (bash MacOS):

unset APP_ENV
unset APP_KEY
...

Edit: That was not the case. This issue only happened in the VSCode terminal. I disabled all the extensions and removed unnecessary ones and the problem was fixed.

Comments

0

Just wanna let you know in case of a database issue around .env file not being read, my solution for a "Database connection failure":

Reason in my case was that my password generator gave me a # as one of the passwords characters, which led to ignored parts of the password. Put the password in double quotes and you're fine.

Comments

-1

I made the mistake by doing dd/die/dump in the index.php file. This causes the system to not regenerate the configs.

Just do dump in view files will do. The changes to .env file update instantly.

Comments

-1

I had some problems with this. It seemed to be a file permission issue somewhere in the app - not the .env-file.

I had to - stop my docker - use chown to set owning-rights to my own user for the whole project - start docker again

This time it worked.

Comments

-1

If you're using sail environment right after you change your environment variable just restart a server, otherwise it's going to show the old value.

Comments

-1

In my case (Laravel 7.x) it happen because I had set environmental variable on server. To be precise in Docker container. And because environments variables are higher priority than .env file, nothing changes during .env file edit.

Check if you set the env variable on the server:

echo $VAR_NAME

Comments

-3

Tried almost all of the above. Ended up doing

chmod 666 .env

which worked. This problem seems to keep cropping up on the app I inherited however, this most recent time was after adding a .env.testing. Running Laravel 5.8

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.