探究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的安全
Oct 09 PHP
php字符串截取中文截取2,单字节截取模式
Dec 10 PHP
网友原创的PHP模板类代码
Sep 07 PHP
Zend framework处理一个http请求的流程分析
Feb 08 PHP
PHP 事务处理数据实现代码
May 13 PHP
基于Snoopy的PHP近似完美获取网站编码的代码
Oct 23 PHP
web目录下不应该存在多余的程序(安全考虑)
May 09 PHP
yii2高级应用之自定义组件实现全局使用图片上传功能的方法
Oct 08 PHP
PHP新特性之字节码缓存和内置服务器
Aug 11 PHP
PHP注释语法规范与命名规范详解篇
Jan 21 PHP
PHP实现浏览器格式化显示XML的方法示例
Jan 22 PHP
PHP levenshtein()函数用法讲解
Mar 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
MySQL修改密码方法总结
2008/03/25 PHP
php实现执行某一操作时弹出确认、取消对话框
2013/12/30 PHP
yii gridview实现时间段筛选功能
2017/08/15 PHP
PHP实现的超长文本分页显示功能示例
2018/06/04 PHP
Laravel 错误提示本地化的实现
2019/10/22 PHP
深入理解JavaScript系列(4) 立即调用的函数表达式
2012/01/15 Javascript
iframe 上下滚动条如何默认在下方实现原理
2012/12/10 Javascript
Javascript 按位与赋值运算符 (&=)使用介绍
2014/02/04 Javascript
JavaScript前补零操作实例
2015/03/11 Javascript
javascript实现链接单选效果的方法
2015/05/13 Javascript
简介EasyUI datagrid editor combogrid搜索框的实现
2016/04/01 Javascript
js实现简单的网页换肤效果
2017/01/18 Javascript
js遍历json的key和value的实例
2017/01/22 Javascript
详解如何在项目中使用jest测试react native组件
2018/02/09 Javascript
vue2.0项目集成Cesium的实现方法
2019/07/30 Javascript
vue 对axios get pust put delete封装的实例代码
2020/01/05 Javascript
在Python的Flask框架下使用sqlalchemy库的简单教程
2015/04/09 Python
Python语言描述随机梯度下降法
2018/01/04 Python
基于Python安装pyecharts所遇的问题及解决方法
2019/08/12 Python
使用Python进行中文繁简转换的实现代码
2019/10/18 Python
pytorch 实现在预训练模型的 input上增减通道
2020/01/06 Python
Python threading.local代码实例及原理解析
2020/03/16 Python
Python使用pyyaml模块处理yaml数据
2020/04/14 Python
基于SpringBoot构造器注入循环依赖及解决方式
2020/04/26 Python
python中rc1什么意思
2020/06/19 Python
python3判断IP地址的方法
2021/03/04 Python
详解html2canvas截图不能截取圆角图片的解决方案
2018/01/30 HTML / CSS
英国最大的专业户外零售商:Mountain Warehouse
2018/06/06 全球购物
三查三看党性分析材料
2014/02/18 职场文书
《燕子》教学反思
2014/02/18 职场文书
银行服务明星推荐材料
2014/05/29 职场文书
大学生学雷锋活动总结
2014/06/26 职场文书
年度安全生产目标责任书
2014/07/23 职场文书
2015秋季开学典礼新闻稿
2015/07/17 职场文书
MySQL 可扩展设计的基本原则
2021/05/14 MySQL
SpringMVC 整合SSM框架详解
2021/08/30 Java/Android