探究Laravel使用env函数读取环境变量为null的问题


Posted in PHP onDecember 06, 2016

发现问题

在 Laravel 项目中,如果执行了 php artisan config:cache 命令把配置文件缓存起来后,在 Tinker 中(Tinker 是 Laravel 自带的一个交互式命令行界面),使用 env 函数读取环境变量的值为 null,只有执行 php artisan config:clear 清除配置缓存后就可以读取了,这是为什么呢?

一探究竟

打开 .env 文件看,这些都是有值的:

APP_ENV=local
APP_KEY=base64:JHE5bOkRg283uT0n1Zq/GgvGEer8ooYiB42/wIcCyvo=
APP_DEBUG=true
APP_LOG_LEVEL=debug
APP_URL=http://www.tanteng.me
 
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=tanteng.me
DB_USERNAME=homestead
DB_PASSWORD=secret

如图所示:

探究Laravel使用env函数读取环境变量为null的问题

原因何在?

在 Laravel 中,如果执行 php aritisan config:cache 命令,Laravel 将会把 app/config 目录下的所有配置文件“编译”整合成一个缓存配置文件到  bootstrap/cache/config.php,每个配置文件都可以通过 env 函数读取环境变量,这里是可以读取的。但是一旦有了这个缓存配置文件,在其他地方使用 env 函数是读取不到环境变量的,所以返回 null.

让我们看看这段代码,Illuminate/Foundation/Bootstrap/DetectEnvironment.php line 18

public function bootstrap(Application $app)
{
 if (! $app->configurationIsCached()) {
 $this->checkForSpecificEnvironmentFile($app);
 
 try {
  (new Dotenv($app->environmentPath(), $app->environmentFile()))->load();
 } catch (InvalidPathException $e) {
  //
 }
 }
}

这个方法在框架启动后就会运行,这段代码说明了如果存在缓存配置文件,就不会去设置环境变量了,配置都读缓存配置文件,而不会再读环境变量了。

因此,在配置文件即 app/config 目录下的其他地方,读取配置不要使用 env 函数去读环境变量,这样你一旦执行 php artisan config:cache 之后,env 函数就不起作用了。所有要用到的环境变量,在 app/config 目录的配置文件中通过 env 读取,其他地方要用到环境变量的都统一读配置文件而不是使用 env 函数读取。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

PHP 相关文章推荐
php读取msn上的用户信息类
Dec 05 PHP
php 无限级分类学习参考之对ecshop无限级分类的解析 带详细注释
Mar 23 PHP
PHP 自定义错误处理函数的使用详解
May 10 PHP
php中的比较运算符详解
Oct 28 PHP
php实现的漂亮分页方法
Apr 17 PHP
详解php的socket通信
Aug 11 PHP
php项目开发中用到的快速排序算法分析
Jun 25 PHP
解决PHP程序运行时:Fatal error: Maximum execution time of 30 seconds exceeded in的错误提示
Nov 25 PHP
PHP基于XMLWriter操作xml的方法分析
Jul 17 PHP
php微信公众号开发之图片回复
Oct 20 PHP
yii2实现Ueditor百度编辑器的示例代码
Nov 02 PHP
php设计模式之工厂方法模式分析【星际争霸游戏案例】
Jan 23 PHP
thinkphp中AJAX返回ajaxReturn()方法分析
Dec 06 #PHP
php中引用符号(&)的使用详细介绍
Dec 06 #PHP
thinkPHP简单实现多个子查询语句的方法
Dec 05 #PHP
thinkPHP自动验证机制详解
Dec 05 #PHP
thinkPHP中_initialize方法实例分析
Dec 05 #PHP
php版微信自定义回复功能示例
Dec 05 #PHP
thinkPHP中配置的读取与C方法详解
Dec 05 #PHP
You might like
上海永华YH-R296(华普R-96)12波段立体声收音机的分析和打理
2021/03/02 无线电
php 高效率写法 推荐
2010/02/21 PHP
header中Content-Disposition的作用与使用方法
2012/06/13 PHP
微信 开发生成带参数的二维码的实例
2016/11/23 PHP
php 7新特性之类型申明详解
2017/06/06 PHP
利用PHP判断是手机移动端还是PC端访问的函数示例
2017/12/14 PHP
php使用imagecopymerge()函数创建半透明水印
2018/01/25 PHP
JS判断是否为数字,是否为整数,是否为浮点数的代码
2010/04/24 Javascript
jquery的ajax简单结构示例代码
2014/02/17 Javascript
跟我学习javascript的prototype,getPrototypeOf和__proto__
2015/11/17 Javascript
javascript实现动态统计图开发实例
2015/11/21 Javascript
jQuery ajax全局函数处理session过期后的ajax跳转问题
2016/06/03 Javascript
jQuery实现6位数字密码输入框
2016/12/29 Javascript
vue-cli项目代理proxyTable配置exclude的方法
2018/09/20 Javascript
C#程序员入门学习微信小程序的笔记
2019/03/05 Javascript
抖音上用记事本编写爱心小程序教程
2019/04/17 Javascript
vue选项卡切换登录方式小案例
2019/09/27 Javascript
windows实现npm和cnpm安装步骤
2019/10/24 Javascript
jQuery加PHP实现图片上传并提交的示例代码
2020/07/16 jQuery
vue-cli中实现响应式布局的方法
2021/03/02 Vue.js
[01:51]开启你的城市传奇 完美世界城市挑战赛开始报名
2018/10/09 DOTA
Python中os和shutil模块实用方法集锦
2014/05/13 Python
python斐波那契数列的计算方法
2018/09/27 Python
pandas 数据归一化以及行删除例程的方法
2018/11/10 Python
Python 实现Serial 与STM32J进行串口通讯
2019/12/18 Python
使用PyTorch将文件夹下的图片分为训练集和验证集实例
2020/01/08 Python
利用Python实现学生信息管理系统的完整实例
2020/12/30 Python
详解Canvas 跨域脱坑实践
2018/11/07 HTML / CSS
如何删除一个表里面的重复行
2013/07/13 面试题
秋季运动会表扬稿
2014/01/16 职场文书
大学毕业感言50字
2014/02/07 职场文书
开学典礼主持词
2014/03/19 职场文书
学校献爱心活动总结
2014/07/08 职场文书
标准版离职证明书
2014/09/12 职场文书
面试复试通知单
2015/04/24 职场文书
2015年反洗钱工作总结
2015/04/25 职场文书