探究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实现多服务器session共享之NFS共享的方法
Mar 16 PHP
header中Content-Disposition的作用与使用方法
Jun 13 PHP
php ImageMagick windows下安装教程
Jan 26 PHP
盘点PHP和ASP.NET的10大对比!
Dec 24 PHP
关于PHP中Session文件过多的问题及session文件保存位置
Mar 17 PHP
PHP 传输会话curl函数的实例详解
Sep 12 PHP
PHP实现的贪婪算法实例
Oct 17 PHP
phpStudy配置多站点多域名方法及遇到的403错误解决方法
Oct 19 PHP
PHP递归的三种常用方式
Feb 28 PHP
PHP DB 数据库连接类定义与用法示例
Mar 11 PHP
Yii2.0框架模型添加/修改/删除数据操作示例
Jul 18 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
Mar 26 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录入页面中动态从数据库中提取数据的实现
2006/10/09 PHP
PHP 危险函数全解析
2009/09/09 PHP
PHP输出时间差函数代码
2013/01/28 PHP
dhtmlxTree目录树增加右键菜单以及拖拽排序的实现方法
2013/04/26 PHP
深入for,while,foreach遍历时间比较的详解
2013/06/08 PHP
PHP加密解密实例分析
2015/12/25 PHP
PHP中关于php.ini参数优化详解
2020/02/28 PHP
JS鼠标事件大全 推荐收藏
2011/11/01 Javascript
JavaScript中的null和undefined解析
2012/04/14 Javascript
javascript 文件的同步加载与异步加载实现原理
2012/12/13 Javascript
JavaScript中setInterval的用法总结
2013/11/20 Javascript
Js表格万条数据瞬间加载实现代码
2014/02/20 Javascript
js实现选中复选框文字变色的方法
2015/08/14 Javascript
JS实现浏览器状态栏显示时间的方法
2015/10/27 Javascript
JavaScript中最容易混淆的作用域、提升、闭包知识详解(推荐)
2016/09/05 Javascript
浅析如何利用JavaScript进行语音识别
2016/10/27 Javascript
jQuery选择器之子元素过滤选择器
2017/09/28 jQuery
Vue.js组件间的循环引用方法示例
2017/12/27 Javascript
JavaScript实现的DOM绘制柱状图效果示例
2018/08/08 Javascript
Vue表单输入绑定的示例代码
2018/11/01 Javascript
Vue动态组件与异步组件实例详解
2019/02/23 Javascript
laravel-admin 与 vue 结合使用实例代码详解
2019/06/04 Javascript
小程序实现搜索框
2020/06/19 Javascript
微信小程序12行js代码自己写个滑块功能(推荐)
2020/07/15 Javascript
利用Python中的pandas库对cdn日志进行分析详解
2017/03/07 Python
Python 中 function(#) (X)格式 和 (#)在Python3.*中的注意事项
2018/11/30 Python
python3.x+pyqt5实现主窗口状态栏里(嵌入)显示进度条功能
2019/07/04 Python
pandas的排序和排名的具体使用
2019/07/31 Python
String是最基本的数据类型吗?
2013/06/13 面试题
职工运动会邀请函
2014/02/02 职场文书
搞笑征婚广告词
2014/03/17 职场文书
请假条的格式
2014/04/11 职场文书
优秀中职教师事迹材料
2014/08/26 职场文书
初中信息技术教学反思
2016/02/16 职场文书
MySQL基础快速入门知识总结(附思维导图)
2021/09/25 MySQL
微信小程序 根据不同用户切换不同TabBar
2022/04/21 Javascript