探究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
我的群发邮件程序
Oct 09 PHP
粗略计算在线时间,bug:ip相同
Dec 09 PHP
用PHP实现递归循环每一个目录
Aug 08 PHP
PHP函数getenv简介和使用实例
May 12 PHP
ThinkPHP模板比较标签用法详解
Jun 30 PHP
php购物车实现方法
Jan 03 PHP
PHP 使用 Imagick 裁切/生成缩略图/添加水印自动检测和处理 GIF
Feb 19 PHP
php轻松实现文件上传功能
Mar 03 PHP
PHP判断一个数组是另一个数组子集的方法详解
Jul 31 PHP
php 多个变量指向同一个引用($b = &$a)用法分析
Nov 13 PHP
解决PHP Opcache 缓存刷新、代码重载出现无法更新代码的问题
Aug 24 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
西德产收音机
2021/03/01 无线电
用PHP读取RSS feed的代码
2008/08/01 PHP
destoon二次开发模板及调用语法汇总
2014/06/21 PHP
PHP扩展Memcache分布式部署方案
2015/12/06 PHP
PHP微信发送推送消息乱码的解决方法
2019/02/28 PHP
JS中剪贴板兼容性、判断复制成功或失败
2021/03/09 Javascript
基于JQuery的模拟苹果桌面Dock效果(稳定版)
2012/10/15 Javascript
JS实现Enter键跳转及控件获得焦点
2013/08/12 Javascript
JQGrid的用法解析(列编辑,添加行,删除行)
2013/11/08 Javascript
Javascript获取数组中的最大值和最小值的方法汇总
2016/01/01 Javascript
返回函数的JavaScript函数
2016/06/14 Javascript
js+css3制作时钟特效
2016/10/16 Javascript
利用jQuery实现一个简单的表格上下翻页效果
2017/03/14 Javascript
Jquery中.bind()、.live()、.delegate()和.on()之间的区别详解
2017/08/01 jQuery
Vue实现剪贴板复制功能
2019/12/31 Javascript
vue使用echarts画组织结构图
2021/02/06 Vue.js
用javascript实现倒计时效果
2021/02/09 Javascript
python解析xml模块封装代码
2014/02/07 Python
python去掉字符串中重复字符的方法
2014/02/27 Python
Python操作CouchDB数据库简单示例
2015/03/10 Python
Python编写百度贴吧的简单爬虫
2015/04/02 Python
实例讲解Python中SocketServer模块处理网络请求的用法
2016/06/28 Python
听歌识曲--用python实现一个音乐检索器的功能
2016/11/15 Python
Python遍历某目录下的所有文件夹与文件路径
2018/03/15 Python
在python中使用requests 模拟浏览器发送请求数据的方法
2018/12/26 Python
新手入门学习python Numpy基础操作
2020/03/02 Python
配件采购员岗位职责
2013/12/03 职场文书
经典优秀个人求职信分享
2013/12/12 职场文书
给客户的道歉信
2014/01/13 职场文书
员工年终自我评价
2014/09/14 职场文书
考试作弊万能检讨书
2014/10/19 职场文书
习近平在党的群众路线教育实践活动总结大会上的讲话
2014/10/21 职场文书
简爱电影观后感
2015/06/10 职场文书
Python if else条件语句形式详解
2022/03/24 Python
Python利用Turtle绘制哆啦A梦和小猪佩奇
2022/04/04 Python
virtualenv隔离Python环境的问题解析
2022/06/21 Python