探究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 getsiteurl()函数
Sep 05 PHP
Ajax+PHP 边学边练之四 表单
Nov 27 PHP
PHP 开发环境配置(Zend Server安装)
Apr 28 PHP
PHP学习之数组值的操作
Apr 17 PHP
php stripslashes和addslashes的区别
Feb 03 PHP
php在数据库抽象层简单使用PDO的方法
Nov 03 PHP
高质量PHP代码的50个实用技巧必备(上)
Jan 22 PHP
PHP魔术方法以及关于独立实例与相连实例的全面讲解
Oct 18 PHP
PHP异常处理定义与使用方法分析
Jul 25 PHP
php中curl和soap方式请求服务超时问题的解决
Jun 11 PHP
PHP getNamespaces()函数讲解
Feb 03 PHP
Laravel中validation验证 返回中文提示 全局设置的方法
Sep 29 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
Zend Framework校验器Zend_Validate用法详解
2016/12/09 PHP
Laravel配置全局公共函数的方法步骤
2019/05/09 PHP
拖动Html元素集合 Drag and Drop any item
2006/12/22 Javascript
MooTools 1.2中的Drag.Move来实现拖放
2009/09/15 Javascript
起点页面传值js,有空研究学习下
2010/01/25 Javascript
利用浏览器全屏api实现js全屏
2014/01/16 Javascript
javascript实现数字验证码的简单实例
2014/02/10 Javascript
jQuery实现购物车计算价格功能的方法
2015/03/25 Javascript
js实现向右横向滑出的二级菜单效果
2015/08/27 Javascript
JS数组排序技巧汇总(冒泡、sort、快速、希尔等排序)
2015/11/24 Javascript
jQuery中使用animate自定义动画的方法
2016/05/29 Javascript
BootStrap网页中代码显示用法详解
2016/10/21 Javascript
nodeJs链接Mysql做增删改查的简单操作
2017/02/04 NodeJs
jQuery通过改变input的type属性实现密码显示隐藏切换功能
2017/02/08 Javascript
微信小程序 JS动态修改样式的实现代码
2017/02/10 Javascript
JS 实现随机验证码功能
2017/02/15 Javascript
jQuery动态添加元素无法触发绑定事件的解决方法分析
2018/01/02 jQuery
vue input输入框模糊查询的示例代码
2018/05/22 Javascript
Vue常用的几个指令附完整案例
2018/11/06 Javascript
Vue.js组件使用props传递数据的方法
2019/10/19 Javascript
javascript实现时间日期的格式化的方法汇总
2020/08/06 Javascript
Python 初始化多维数组代码
2008/09/06 Python
几个提升Python运行效率的方法之间的对比
2015/04/03 Python
用Python实现服务器中只重载被修改的进程的方法
2015/04/30 Python
python数据类型_元组、字典常用操作方法(介绍)
2017/05/30 Python
python使用两种发邮件的方式smtp和outlook示例
2017/06/02 Python
python如何把嵌套列表转变成普通列表
2018/03/20 Python
python使用PIL模块获取图片像素点的方法
2019/01/08 Python
Python代码块及缓存机制原理详解
2019/12/13 Python
Django框架配置mysql数据库实现过程
2020/04/22 Python
python轮询机制控制led实例
2020/05/03 Python
Smallable英国家庭概念店:设计师童装及家居装饰
2017/07/05 全球购物
三分钟英语演讲稿
2014/04/24 职场文书
人事主管岗位职责说明书
2014/07/30 职场文书
党的群众路线教育实践活动整改方案
2014/10/28 职场文书
医生辞职信范文
2015/03/02 职场文书