探究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 相关文章推荐
php4的彩蛋
Oct 09 PHP
过滤掉PHP数组中的重复值的实现代码
Jul 17 PHP
PHP多例模式介绍
Jun 24 PHP
php中怎么搜索相关联数组键值及获取之
Oct 17 PHP
PHP实现获取图片颜色值的方法
Jul 11 PHP
php 使用file_get_contents读取大文件的方法
Nov 13 PHP
smarty学习笔记之常见代码段用法总结
Mar 19 PHP
php实现留言板功能
Mar 05 PHP
降低PHP Redis内存占用
Mar 23 PHP
PHP观察者模式实例分析【对比JS观察者模式】
May 22 PHP
Laravel使用原生sql语句并调用的方法
Oct 09 PHP
Laravel相关的一些故障解决
Aug 19 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 在线打包_支持子目录
2008/06/28 PHP
PHP基础之运算符的使用方法
2013/04/28 PHP
解密ThinkPHP3.1.2版本之独立分组功能应用
2014/06/19 PHP
PHP制作图形验证码代码分享
2014/10/23 PHP
基于thinkPHP实现的微信自定义分享功能示例
2016/09/23 PHP
Yii框架getter与setter方法功能与用法分析
2019/10/22 PHP
javascript编程起步(第五课)
2007/01/10 Javascript
extjs tabpanel限制选项卡数量实现思路及代码
2013/04/02 Javascript
jQuery中:header选择器用法实例
2014/12/29 Javascript
jQuery获得document和window对象宽度和高度的方法
2015/03/25 Javascript
Vue.js学习记录之在元素与template中使用v-if指令实例
2017/06/27 Javascript
vue 插值 v-once,v-text, v-html详解
2018/01/19 Javascript
利用vue.js实现被选中状态的改变方法
2018/02/08 Javascript
Vue-cli项目获取本地json文件数据的实例
2018/03/07 Javascript
vue.js将时间戳转化为日期格式的实现代码
2018/06/05 Javascript
JavaScript简易计算器制作
2020/01/17 Javascript
[04:28]2014DOTA2国际邀请赛 采访小兔子LGD挺进钥匙体育馆
2014/07/14 DOTA
[53:23]Secret vs Liquid 2018国际邀请赛淘汰赛BO3 第二场 8.25
2018/08/29 DOTA
[42:20]Secret vs Liquid 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
[55:35]DOTA2-DPC中国联赛 正赛 CDEC vs Dragon BO3 第二场 1月22日
2021/03/11 DOTA
简明 Python 基础学习教程
2007/02/08 Python
python调用fortran模块
2016/04/08 Python
python中nan与inf转为特定数字方法示例
2017/05/11 Python
Python入门学习指南分享
2018/04/11 Python
python gdal安装与简单使用
2019/08/01 Python
利用Python如何制作贪吃蛇及AI版贪吃蛇详解
2020/08/24 Python
Selenium Webdriver元素定位的八种常用方式(小结)
2021/01/13 Python
阿迪达斯意大利在线商店:adidas意大利
2016/09/19 全球购物
澳大利亚当地最大的时装生产商:Cue
2018/08/06 全球购物
创业计划书的主要内容有哪些
2014/01/29 职场文书
旅游管理专业大学生职业规划书
2014/02/27 职场文书
满月酒主持词
2014/03/27 职场文书
教师求职信范文
2014/05/24 职场文书
一份关于丢失公司财物的检讨书
2014/09/19 职场文书
出生公证书
2015/01/23 职场文书
收音机爱好者玩机13年,简评其使用过的19台收音机
2022/04/30 无线电