版权声明:本文为博主原创文章,未经博主允许不得转载。 /qq_/article/details/
根据不同环境服务器设置系统变量(可根据phpinfo()
查看APP_ENV
环境变量是否OK):
这样,项目根目录下就会有根据不同环境对应的.env.xxx
文件,放入版本控制,本地的环境对应.env
不需要放入版本控制。
原理可看laravel的源码:
昨天同事在他的项目中遇到了一个技术难题让我协助解决
据他反映,之前本地开发时功能都是正常的,上线之后才开始出现的问题
// 此处省略部分代码
可以发现,实际上调用的就是php自带的getenv
函数,如果取不到值,那必定是某段执行putenv
或者操作$_ENV
全局变量的代码没有执行,而且这些环境变量设置操作一定是在初始化的时候进行的
在代码中,我们并没有发现任何执行putenv
或者操作$_ENV
全局变量的地方,实际上在整个Laravel的框架代码里也没有发现蛛丝马迹,那么这些环境变量是如何保存进来的呢?
如果Laravel框架里没有执行这些代码,我们应该可以推测是框架使用的第三方组件做了这些事情
Laravel那一套.env文件的玩法就是使用的这个组件,有兴趣的同学可以研究一下
好了,暂时总结一下分析的结果
那么env
获取不到值只能说明Dotenv
的实例化并没有执行
而这个方法的作用就是判断 bootstrap/cache/config.php
缓存文件是否存在,如果文件存在则不会执行Dotenv
的实例化操作,也就不会往$_ENV
里存数据,自然env
函数是取不到值的
这是对config目录下的所有配置文件做的缓存
那么,真相大白了,之前在开发时并没有出现问题,是因为没有执行 config:cache
命令,而项目上线后为了优化访问速度,生成了缓存文件,导致env
取值失败
可以疑问还是存在,既然Laravel提供了env
函数,为什么还有这个坑呢?是bug吗?如果env
不能使用,那该使用什么方式呢?
本着一探究竟的态度,仔细阅读了文档,在 里找到了答案
如果使用了config:cache
,env函数只能在config目录下的配置文件的php里使用,不可以在其他地方使用。
一个非常简单的办法就是将
所有的 Lumen 框架的配置信息都存储在 .env
文件中。
你可以使用 config
辅助函数获取你的设置值,设置值可以通过「点」语法来获取,其中包含了文件与选项的名称。你也可以指定一个默认值,当该设置选项不存在时就会返回默认值:
若要在运行期间修改设置值,请传递一个数组至 config
辅助函数:
应用程序常常需要根据不同的运行环境设置不同的值。例如,你会希望在本机开发环境上有与正式环境不同的缓存驱动。只需通过配置文件就可轻松完成。
Lumen,这个文件将自动被更名为 .env
,否则你只能手动更改文件名。
当你的应用程序收到请求时,这个文件所有的变量都会被加载到 PHP 超级全局变量 $_ENV
里。你可以使用辅助函数 env
来获取这些变量的值:
env
的第二个参数是备用数据,如果 APP_DEBUG
未设置的话,true
就会被当做备用数据返回。
根据本机服务器或者正式环境的需求的不同,可自由修改环境变量。但是,.env
文件不应该被提交到应用程序的版本控制系统,因为每个开发人员或服务器在使用应用程序时,可能需要不同的环境配置。
如果你是某个团队的开发者,建议将 .env.example
文件放进你的应用程序。通过样本配置文件里的预设值,你团队中的其他开发人员就可以清楚地知道,在运行你的应用程序时有哪些环境变量是必须有的。
应用程序的当前环境是由 .env
文件中的 APP_ENV
变量所决定的。你可以通过应用程序实例的 environment
方法来获取该值:
你也可以传递参数至 environment
方法来确认当前环境是否与参数相符合: