探究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 相关文章推荐
一个程序下载的管理程序(一)
Oct 09 PHP
php 来访国内外IP判断代码并实现页面跳转
Dec 18 PHP
dedecms系统的广告设置代码 基础版本
Apr 09 PHP
php session安全问题分析
Jun 24 PHP
浅析php中jsonp的跨域实例
Jun 21 PHP
Codeigniter+PHPExcel实现导出数据到Excel文件
Jun 12 PHP
php实现指定字符串中查找子字符串的方法
Mar 17 PHP
PHP人民币金额转大写实例代码
Oct 02 PHP
php结合md5实现的加密解密方法
Jan 25 PHP
对比分析php中Cookie与Session的异同
Feb 19 PHP
php实现在线通讯录功能(附源码)
May 13 PHP
简单谈谈PHP面向对象之标识对象
Jun 27 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
使用ThinkPHP+Uploadify实现图片上传功能
2014/06/26 PHP
PHP 数组遍历foreach语法结构及实例
2016/06/13 PHP
PHP基于array_unique实现二维数组去重
2020/07/14 PHP
Wordpress ThickBox 点击图片显示下一张图的修改方法
2010/12/11 Javascript
在jQuery 1.5中使用deferred对象的代码(翻译)
2011/03/10 Javascript
JS动态添加与删除select中的Option对象(示例代码)
2013/12/25 Javascript
可自定义速度的js图片无缝滚动示例分享
2014/01/20 Javascript
jQuery简单实现input文本框内灰色提示文本效果的方法
2015/12/02 Javascript
JQuery异步加载PartialView的方法
2016/06/07 Javascript
异步加载JS、CSS代码(推荐)
2016/06/15 Javascript
NodeJs读取JSON文件格式化时的注意事项
2016/09/25 NodeJs
windows下vue-cli导入bootstrap样式
2017/04/25 Javascript
JavaScript基于activexobject连接远程数据库SQL Server 2014的方法
2017/07/12 Javascript
AngularJs导出数据到Excel的示例代码
2017/08/11 Javascript
利用Node.js检测端口是否被占用的方法
2017/12/07 Javascript
浅谈Vue Element中Select下拉框选取值的问题
2018/03/01 Javascript
angular实现input输入监听的示例
2018/08/31 Javascript
微信小程序 导入图标实现过程详解
2019/10/11 Javascript
JS操作Fckeditor的一些常用方法(获取、插入等)
2020/02/19 Javascript
解决vue bus.$emit触发第一次$on监听不到问题
2020/07/28 Javascript
[04:26]2014DOTA2国际邀请赛-Newbee顺利进入胜者组决赛 独家专访战神7
2014/07/19 DOTA
[01:17]辉夜杯战队访谈宣传片—EHOME
2015/12/25 DOTA
Python实现字典按照value进行排序的方法分析
2017/12/23 Python
python代理工具mitmproxy使用指南
2019/07/04 Python
Pytorch Tensor的索引与切片例子
2019/08/18 Python
500行代码使用python写个微信小游戏飞机大战游戏
2019/10/16 Python
python 实现分组求和与分组累加求和代码
2020/05/18 Python
Python3 webservice接口测试代码详解
2020/06/23 Python
利用CSS3实现炫酷的飞机起飞动画
2016/09/17 HTML / CSS
天美时手表加拿大官网:Timex加拿大
2016/09/01 全球购物
延安红色之旅心得体会
2014/10/07 职场文书
店长岗位职责
2015/02/11 职场文书
社区工作者个人总结
2015/02/28 职场文书
在职人员跳槽求职信
2015/03/20 职场文书
求职意向书范本
2015/05/11 职场文书
观看《筑梦中国》纪录片心得体会
2016/01/18 职场文书