探究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程序61条面向对象分析设计的经验小结
Nov 12 PHP
使用PHP导出Word文档的原理和实例
Oct 21 PHP
CodeIgniter基本配置详细介绍
Nov 12 PHP
PHP反射机制用法实例
Aug 28 PHP
PHP 5.3和PHP 5.4出现FastCGI Error解决方法
Feb 12 PHP
PHP上传文件参考配置大文件上传
Dec 16 PHP
yii,CI,yaf框架+smarty模板使用方法
Dec 29 PHP
PHP5.5.15+Apache2.4.10+MySQL5.6.20配置方法分享
May 06 PHP
Yii2第三方类库插件Imagine的安装和使用
Jul 06 PHP
Laravel接收前端ajax传来的数据的实例代码
Jul 20 PHP
PHP实现的字符串匹配算法示例【sunday算法】
Dec 19 PHP
jQuery ajax+PHP实现的级联下拉列表框功能示例
Feb 12 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 jquery 多文件上传简单实例
2013/12/23 PHP
PHP中__FILE__、dirname与basename用法实例分析
2014/12/01 PHP
smarty简单应用实例
2015/11/03 PHP
javascript 对象的定义方法
2007/01/10 Javascript
JS 密码强度验证(兼容IE,火狐,谷歌)
2010/03/15 Javascript
jQuery中与toggleClass等价的程序段 以及未来学习的方向
2010/03/18 Javascript
JS获取页面input控件中所有text控件并追加样式属性
2013/02/25 Javascript
js中的屏蔽的使用示例
2013/07/30 Javascript
js中判断对象是否为空的三种实现方法
2013/12/23 Javascript
javascript中attribute和property的区别详解
2014/06/05 Javascript
express的中间件basicAuth详解
2014/12/04 Javascript
详解JavaScript中的异常处理方法
2015/06/16 Javascript
JS模拟按钮点击功能的方法
2015/12/22 Javascript
Mvc提交表单的四种方法全程详解
2016/08/10 Javascript
AngularJS入门教程之多视图切换用法示例
2016/11/02 Javascript
详解Angular.js的$q.defer()服务异步处理
2016/11/06 Javascript
canvas红包照片实例分享
2017/02/28 Javascript
jQuery Chosen通用初始化
2017/03/07 Javascript
nodeJs实现基于连接池连接mysql的方法示例
2018/02/10 NodeJs
解决vue 更改计算属性后select选中值不更改的问题
2018/03/02 Javascript
[02:01]2018完美盛典-开场舞《双子星》
2018/12/16 DOTA
python TF-IDF算法实现文本关键词提取
2019/05/29 Python
Python API 自动化实战详解(纯代码)
2019/06/11 Python
python enumerate内置函数用法总结
2020/01/07 Python
详解python中GPU版本的opencv常用方法介绍
2020/07/24 Python
CSS3的column-fill属性对齐列内容高度的用法详解
2016/07/01 HTML / CSS
牧马人澳大利亚官网:Wrangler澳大利亚
2019/10/08 全球购物
荷兰最大的鞋子、服装和运动折扣店:Bristol
2021/01/07 全球购物
教师一岗双责责任书
2014/04/16 职场文书
大学生通用个人自我评价
2014/04/27 职场文书
学校清洁工岗位职责
2015/04/15 职场文书
高中生综合素质评价范文
2015/08/18 职场文书
《给予树》教学反思
2016/03/03 职场文书
python 通过使用Yolact训练数据集
2021/04/06 Python
Vue Element-ui表单校验规则实现
2021/07/09 Vue.js
Python实现抖音热搜定时爬取功能
2022/03/16 Python