探究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 CKEditor 上传图片实现代码
Nov 06 PHP
php 操作符与控制结构
Mar 07 PHP
php中使用redis队列操作实例代码
Feb 07 PHP
深入理解require与require_once与include以及include_once的区别
Jun 05 PHP
PHP利用REFERER根居访问来地址进行页面跳转
Sep 28 PHP
解决yii2左侧菜单子级无法高亮问题的方法
May 08 PHP
PHP实践教程之过滤、验证、转义与密码详解
Jul 24 PHP
swoole和websocket简单聊天室开发
Nov 18 PHP
详解PHP中的外观模式facade pattern
Feb 05 PHP
php框架CodeIgniter使用redis的方法分析
Apr 13 PHP
PHP Redis扩展无法加载的问题解决方法
Aug 22 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
肝肠寸断了解下!盘点史上最伤心的十大动漫
2020/03/04 日漫
收集的二十一个实用便利的PHP函数代码
2010/04/22 PHP
PHP获取当前日期所在星期(月份)的开始日期与结束日期(实现代码)
2013/06/18 PHP
解析php中用PHPMailer来发送邮件的示例(126.com的例子)
2013/06/24 PHP
php实现图片文件与下载文件防盗链的方法
2014/11/03 PHP
php 批量查询搜狗sogou代码分享
2015/05/17 PHP
浅谈php的TS和NTS的区别
2019/03/13 PHP
laravel 多图上传及图片的存储例子
2019/10/14 PHP
php下的原生ajax请求用法实例分析
2020/02/28 PHP
身份证号码前六位所代表的省,市,区, 以及地区编码下载
2007/04/12 Javascript
jQuery开发者都需要知道的5个小技巧
2010/01/08 Javascript
分享几种比较简单实用的JavaScript tabel切换
2015/12/31 Javascript
Vuejs第九篇之组件作用域及props数据传递实例详解
2016/09/05 Javascript
Ajax与服务器(JSON)通信实例代码
2016/11/05 Javascript
Vue.js开发环境搭建
2016/11/10 Javascript
微信小程序 swiper组件轮播图详解及实例
2016/11/16 Javascript
详解webpack 多页面/入口支持&公共组件单独打包
2017/06/29 Javascript
BootStrap中的模态框(modal,弹出层)功能示例代码
2018/11/02 Javascript
Elementui表格组件+sortablejs实现行拖拽排序的示例代码
2019/08/28 Javascript
Python 变量类型及命名规则介绍
2013/06/08 Python
python入门教程之识别验证码
2017/03/04 Python
详解Numpy数组转置的三种方法T、transpose、swapaxes
2019/05/27 Python
Python操作Excel工作簿的示例代码(\*.xlsx)
2020/03/23 Python
python网络编程之五子棋游戏
2020/05/14 Python
详解利用python识别图片中的条码(pyzbar)及条码图片矫正和增强
2020/11/17 Python
python中的对数log函数表示及用法
2020/12/09 Python
html5的canvas方法使用指南
2014/12/15 HTML / CSS
解决HTML5中滚动到底部的事件问题
2019/08/22 HTML / CSS
澳大利亚新奇小玩意网站:Yellow Octopus
2017/12/28 全球购物
墨西哥购物网站:Elektra
2020/01/21 全球购物
strstr()的简单实现
2013/09/26 面试题
科长竞争上岗演讲稿
2014/05/12 职场文书
小学教师师德师风演讲稿
2014/08/22 职场文书
2014教师年度思想工作总结
2014/11/10 职场文书
公司团队口号霸气押韵
2015/12/24 职场文书
浅谈Go语言多态的实现与interface使用
2021/06/16 Golang