173

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 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)

Clearly not pulling in my env config. This is affecting every single one of my config files, including third party 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 basically only copied in my app folder; no additional composer packages are included. Still having the same issue. I have other Laravel 5.2 projects on the same server that are working fine.

miken32
  • 42,008
  • 16
  • 111
  • 154
andrewtweber
  • 24,520
  • 22
  • 88
  • 110

25 Answers25

221

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
andrewtweber
  • 24,520
  • 22
  • 88
  • 110
benjolly1989
  • 2,732
  • 1
  • 12
  • 3
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

Nisse Engström
  • 4,738
  • 23
  • 27
  • 42
Gaurav Gupta
  • 5,380
  • 2
  • 29
  • 36
  • 41
    `php artisan config:cache` solved it for me - nothing else had helped. Not even `php artisan config:clear` - thanks! – kair May 15 '16 at 20:26
  • 43
    Laravel 5.3 `php artisan config:clear` is the only thing that worked for me – Peon Jul 06 '17 at 12:15
  • 11
    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. – Antonio Jul 23 '17 at 21:22
  • https://github.com/laravel/framework/issues/19986#issuecomment-314317348 – Alex Mar 09 '18 at 07:28
  • make sure you're editing `.env` instead of `.env.example` file – Connor Leech Jul 15 '18 at 12:49
  • make sure you don't call `config:cache` before creating .env file :) – ruuter Mar 15 '20 at 10:14
64

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.

TrOnNe
  • 1,632
  • 16
  • 30
  • 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. – user2957058 Sep 18 '21 at 18:11
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

andrewtweber
  • 24,520
  • 22
  • 88
  • 110
  • Same think - seems like spaces causes issues in `.env` under 5.2 where as in 5.1 it didn't. – thomthom Dec 29 '15 at 17:59
  • 5
    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. – dKen Apr 22 '16 at 14:07
  • 2
    I've already wasted hours on something so silly. Thank you for stopping me waste more! – Jenski May 13 '18 at 02:02
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
Deric Lima
  • 1,972
  • 2
  • 24
  • 33
  • Note that `artisan optimize` builds a number of caches, including the config cache, as in the accepted answer. – miken32 Jan 13 '22 at 23:17
23

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");
Majbah Habib
  • 8,058
  • 3
  • 36
  • 38
  • 1
    Just wanted to add that it's a bad idea to add secrets to the code base (see recommendation 6). – Sherlock Feb 01 '21 at 08:18
  • This is not real client & secret id, I have given a draft information to make understand the solution finder. Thanks @Sherlock – Majbah Habib Feb 02 '21 at 04:08
  • 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. – Sherlock Feb 02 '21 at 14:25
  • please be careful: recommendation 6 is not a good practice – Simone Pessotto May 10 '22 at 12:28
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.

dKen
  • 3,078
  • 1
  • 28
  • 37
  • 2
    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! – Bruno P. Kinoshita Jun 02 '16 at 07:56
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.
jay_mziray
  • 301
  • 2
  • 8
7

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
Stavros
  • 743
  • 8
  • 19
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
...
Waqleh
  • 9,741
  • 8
  • 65
  • 103
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.

Payal Pandav
  • 139
  • 1
  • 8
2

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

gp_sflover
  • 3,460
  • 5
  • 38
  • 48
Angel Prieto
  • 43
  • 1
  • 7
  • 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. – Ciberman Feb 27 '23 at 16:33
2

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.

Kamil Kiełczewski
  • 85,173
  • 29
  • 368
  • 345
  • 3
    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` – Zohaib Sep 13 '19 at 15:12
  • @ZohaibHassan How to turn off cache for config and routes on dev environment? – Kamil Kiełczewski Sep 13 '19 at 15:47
  • 1
    Above command will turn off 1. routes cache, 2 config cache, 3. clear views 4. clear optimized files 5. clear cache if any – Zohaib Sep 13 '19 at 19:53
  • 1
    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 – Zohaib Sep 13 '19 at 19:55
2

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.

mark
  • 6,308
  • 8
  • 46
  • 57
1

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.

gthuo
  • 2,376
  • 5
  • 23
  • 30
  • `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 – Marcin Orlowski Apr 14 '20 at 17:58
1

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

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

w5m
  • 2,286
  • 3
  • 34
  • 46
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
Aaron Mason
  • 310
  • 3
  • 11
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.

minasrc
  • 89
  • 8
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/';
Pham Quang
  • 129
  • 1
  • 8
-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.

Bing Han
  • 684
  • 6
  • 13
-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.

thephper
  • 2,342
  • 22
  • 21
-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.

David
  • 1,932
  • 3
  • 27
  • 35
-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
GetoX
  • 4,225
  • 2
  • 33
  • 30
-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

PeterG
  • 772
  • 2
  • 11
  • 28