探究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常用字符串的总结(待续)
Jun 07 PHP
解析如何通过PHP函数获取当前运行的环境 来进行判断执行逻辑(小技巧)
Jun 25 PHP
CodeIgniter基本配置详细介绍
Nov 12 PHP
destoon整合UCenter图文教程
Jun 21 PHP
PHP中preg_match函数正则匹配的字符串长度问题
May 27 PHP
在WordPress中实现评论头像的自定义默认和延迟加载
Nov 24 PHP
ThinkPHP 3.2.3实现页面静态化功能的方法详解
Aug 03 PHP
PHP去除空数组且数组键名重置的讲解
Feb 28 PHP
PHP快速排序算法实现的原理及代码详解
Apr 03 PHP
ThinkPHP3.2.3框架实现执行原生SQL语句的方法示例
Apr 03 PHP
Yii框架安装简明教程
May 15 PHP
THINKPHP5.1 Config的配置与获取详解
Jun 08 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
php时间戳格式化显示友好的时间函数分享
2014/10/21 PHP
php支持中文字符串分割的函数
2015/05/28 PHP
浅谈php中的访问修饰符private、protected、public的作用范围
2016/11/20 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
2020/02/27 PHP
PHP设计模式入门之迭代器模式原理与实现方法分析
2020/04/26 PHP
Javascript 同时提交多个Web表单的方法
2009/02/19 Javascript
JQuery 拾色器插件发布-jquery.icolor.js
2010/10/20 Javascript
jQuery学习笔记之jQuery选择器的使用
2010/12/22 Javascript
js操作textarea 常用方法总结
2012/12/03 Javascript
jquery实现盒子下拉效果示例代码
2013/09/12 Javascript
浅析JavaScript中的delete运算符
2013/11/30 Javascript
动态的绑定事件addEventListener方法的使用
2014/01/24 Javascript
js 通过html()及text()方法获取并设置p标签的显示值
2014/05/14 Javascript
jQuery实现数字加减效果汇总
2014/12/16 Javascript
Node.js复制文件的方法示例
2016/12/29 Javascript
JavaScript实现隐藏省略文字效果的方法
2017/04/27 Javascript
vuejs手把手教你写一个完整的购物车实例代码
2017/07/06 Javascript
如何实现双向绑定mvvm的原理实现
2019/05/28 Javascript
详解阿里Node.js技术文档之process模块学习指南
2021/01/04 Javascript
[46:55]Ti4 冒泡赛第二轮 LGD vs C9
2014/07/14 DOTA
[32:17]完美世界DOTA2联赛循环赛LBZS vs Forest第二场 10月30日
2020/10/31 DOTA
Python网页解析利器BeautifulSoup安装使用介绍
2015/03/17 Python
浅谈Python处理PDF的方法
2017/11/10 Python
mac下如何将python2.7改为python3
2018/07/13 Python
python顺序执行多个py文件的方法
2019/06/29 Python
如何基于python对接钉钉并获取access_token
2020/04/21 Python
python框架flask入门之环境搭建及开启调试
2020/06/07 Python
使用python-cv2实现Harr+Adaboost人脸识别的示例
2020/10/27 Python
中国首家奢侈品O2O网购平台:第五大道奢侈品网
2017/12/14 全球购物
DBA数据库管理员JAVA程序员架构师必看
2016/02/07 面试题
创建市级文明单位实施方案
2014/03/01 职场文书
事业单位绩效考核实施方案
2014/03/27 职场文书
党校毕业心得体会
2014/09/13 职场文书
解决python3安装pandas出错的问题
2021/05/20 Python
python图片灰度化处理的几种方法
2021/06/23 Python
mongodb数据库迁移变更的解决方案
2021/09/04 MongoDB