探究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 MsSql server时遇到的中文编码问题
Jun 11 PHP
PHP 强制下载文件代码
Oct 24 PHP
查找php配置文件php.ini所在路径的二种方法
May 26 PHP
PHP命令行脚本接收传入参数的三种方式
Aug 20 PHP
PHP函数eval()介绍和使用示例
Aug 20 PHP
php实现俄罗斯乘法实例
Mar 07 PHP
php实现登陆模块功能示例
Oct 20 PHP
php实现URL加密解密的方法
Nov 17 PHP
php cookie用户登录的详解及实例代码
Jan 03 PHP
php实现生成code128条形码的方法详解
Jul 19 PHP
php实现在线考试系统【附源码】
Sep 18 PHP
laravel-admin解决表单select联动时,编辑默认没选上的问题
Sep 30 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 $_FILES中error返回值详解
2014/01/30 PHP
php从文件夹随机读取文件的方法
2015/06/01 PHP
两种php给图片加水印的实现代码
2020/04/18 PHP
浅谈PHP发送HTTP请求的几种方式
2017/07/25 PHP
accesskey 提交
2006/06/26 Javascript
asp javascript 实现关闭窗口时保存数据的办法
2007/11/24 Javascript
javascript 系统文件夹文件操作及参数介绍
2013/01/08 Javascript
javascript函数重载解决方案分享
2014/02/19 Javascript
js显示动态时间的方法详解
2016/08/20 Javascript
JavaScript实现清空(重置)文件类型INPUT元素值的方法
2016/11/17 Javascript
JavaScript微信定位功能实现方法
2016/11/29 Javascript
AngularJS使用ng-app自动加载bootstrap框架问题分析
2017/01/04 Javascript
Vue父组件如何获取子组件中的变量
2019/07/24 Javascript
使用Angular9和TypeScript开发RPG游戏的方法
2020/03/25 Javascript
javascript实现简单搜索功能
2020/03/26 Javascript
[50:22]完美盛典-2018年度红毯走秀
2018/12/16 DOTA
python2 与python3的print区别小结
2018/01/16 Python
python爬取微信公众号文章
2018/08/31 Python
pandas删除指定行详解
2019/04/04 Python
Python流程控制 while循环实现解析
2019/09/02 Python
python 单线程和异步协程工作方式解析
2019/09/28 Python
利用HTML5画出一个坦克的形状具体实现代码
2013/06/20 HTML / CSS
HTML5页面嵌入小程序没有返回按钮及返回页面空白的问题
2020/05/28 HTML / CSS
Boden澳大利亚官网:英国在线服装公司
2018/08/05 全球购物
澳大利亚领先的孕妇服装品牌:Mamaway
2018/08/14 全球购物
main 函数执行以前,还会执行什么代码
2013/04/17 面试题
视图的作用
2014/12/19 面试题
JAVA程序员自荐书
2014/01/30 职场文书
计算机通信专业推荐信
2014/02/22 职场文书
《小猪家的桃花树》教学反思
2014/04/11 职场文书
药剂专业毕业生求职信
2014/06/24 职场文书
大学生党员批评与自我批评范文
2014/10/14 职场文书
淮阳太昊陵导游词
2015/02/10 职场文书
西柏坡观后感
2015/06/08 职场文书
重温入党誓词主持词
2015/06/29 职场文书
《小摄影师》教学反思
2016/02/18 职场文书