在启动时会加载项目中的 文件。对于应用程序运行的环境来说,不同的环境有不同的配置通常是很有用的。 例如,你可能希望在本地使用测试的 数据库而在上线后希望项目能够自动切换到生产 数据库。本文将会详细介绍 文件的使用与源码的分析。
Env文件的使用
多环境env的设置
项目中 文件的数量往往是跟项目的环境数量相同,假如一个项目有开发、测试、生产三套环境那么在项目中应该有三个 、 、 三个环境配置文件与环境相对应。三个文件中的配置项应该完全一样,而具体配置的值应该根据每个环境的需要来设置。
接下来就是让项目能够根据环境加载不同的 文件了。具体有三种方法,可以按照使用习惯来选择使用:
在环境的 配置文件里设置 环境变量
设置服务器上运行PHP的用户的环境变量,比如在 用户的 中添加
在部署项目的持续集成任务或者部署脚本里执行
针对前两种方法, 会根据 加载到的变量值去加载对应的文件 、 这些。 具体在后面源码里会说,第三种比较好理解就是在部署项目时将环境的配置文件覆盖到 文件里这样就不需要在环境的系统和 里做额外的设置了。
自定义env文件的路径与文件名
文件默认放在项目的根目录中, 为用户提供了自定义 文件路径或文件名的函数,
例如,若想要自定义 路径,可以在 文件夹中 中使用 实例的 方法:
若想要自定义 文件名称,就可以在 文件夹中 中使用 实例的 方法:
Laravel 加载ENV配置
加载 的是在框架处理请求之前,bootstrap过程中的 阶段中完成的。
我们来看一下 的源码来分析下 是怎么加载 中的配置的。
在他的启动方法 中, 会检查配置是否缓存过以及判断应该应用那个 文件,针对上面说的根据环境加载配置文件的三种方法中的头两种,因为系统或者nginx环境变量中设置了 ,所以Laravel会在 方法里根据 的值设置正确的配置文件的具体路径, 比如 或者 ,而针对第三中情况则是默认的 , 具体可以参看下面的 还有相关的Application里的两个方法的源码:
判断好后要读取的配置文件的路径后,接下来就是加载 里的配置了。
使用的是 的PHP版本
它依赖 来加载数据:
读取配置时 函数会用 函数将配置从文件中一行行地读取到数组中去,然后排除以 开头的注释,针对内容中包含 的行去调用 方法去把文件行中的环境变量配置到项目中去:
实例化 的时候把 对象的 属性设置成了 , 设置变量的时候如果通过 方法读取到了变量值,那么就会跳过该环境变量的设置。所以 默认情况下不会覆盖已经存在的环境变量,这个很关键,比如说在 的容器编排文件里,我们会给 应用容器设置关于 容器的两个环境变量
这样在容器里设置好环境变量后,即使 文件里的 为 用 函数读取出来的也还是容器里之前设置的 环境变量的值 (docker中容器链接默认使用服务名称,在编排文件中我把mysql容器的服务名称设置成了database, 所以php容器要通过database这个host来连接mysql容器)。因为用我们在持续集成中做自动化测试的时候通常都是在容器里进行测试,所以 不会覆盖已存在环境变量这个行为就相当重要这样我就可以只设置容器里环境变量的值完成测试而不用更改项目里的 文件,等到测试完成后直接去将项目部署到环境上就可以了。
如果检查环境变量不存在那么接着Dotenv就会把环境变量通过PHP内建函数 设置到环境中去,同时也会存储到 和 这两个全局变量中。
在项目中读取env配置
在Laravel应用程序中可以使用 函数去读取环境变量的值,比如获取数据库的HOST:
传递给 函数的第二个值是「默认值」。如果给定的键不存在环境变量,则会使用该值。
我们来看看 函数的源码:
它直接通过 内建函数 读取环境变量。
我们看到了在加载配置和读取配置的时候,使用了 和 两个函数。 设置的环境变量只在请求期间存活,请求结束后会恢复环境之前的设置。因为如果php.ini中的 配置项成了 不包含 的话,那么php程序中是无法通过 读取环境变量的,所以使用 动态地设置环境变量让开发人员不用去关注服务器上的配置。而且在服务器上给运行用户配置的环境变量会共享给用户启动的所有进程,这就不能很好的保护比如 、 这种私密的环境变量,所以这种配置用 设置能更好的保护这些配置信息, 方法能获取到系统的环境变量和 动态设置的环境变量。
领取专属 10元无门槛券
私享最新 技术干货