在创建Laravel项目时,不论是通过composer还是仓库拉取,都会在根目录下创建一个.env.example文件,这是一个配置文件的示例:
APP_NAME=Laravel
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost
//后续省略
将这个文件重命名为.env,即成为正式的配置文件。env是英语 environment(环境)的缩写。
如果项目根目录已经存在.env文件,则省略这一步。但大多数情况下,env文件由于配置了大量项目信息,部分内容可能是私有保密的,因此默认在git的忽略列表中。
获取配置信息
使用env函数即可获取env文件中配置的信息
格式:env( '配置项' , '缺省值')
//.env文件
APP_NAME=Laravel
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost
//后续省略
env('APP_URL');
//输出 http://localhost
env('APP_TIME','2024');
//.env文件不存在APP_TIME配置项,输出缺省值2024
env('APP_TIME');
//.env文件不存在APP_TIME配置项,也没有缺省值,输出null
建议使用env函数时配置缺省值,以免发生没有配置项的错误。
配置文件使用最佳实践
前面提到,env是英语 environment(环境)的缩写。顾名思义,一些跟环境相关的设定参数都可以写到.env文件中。最常见的,也是示例.env文件中就已经存在的数据库配置:
DB_CONNECTION=mysql //数据库类型,例如mysql、SQL server、postgre等等
DB_HOST=127.0.0.1 //数据库服务器地址
DB_PORT=3306 //数据库服务器端口
DB_DATABASE= //数据库名称
DB_USERNAME= //用户名
DB_PASSWORD= //密码
框架如何获取到.env文件中的配置?
在项目根目录config文件夹下,database.php即为框架的数据库配置文件。
// config/database.php
// 已删除其他无关配置
return [
'default' => env('DB_CONNECTION', 'mysql'),
'connections' => [
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
],
],
];
可以看到,在配置文件中,同样使用了env函数来获取.env文件中配置的信息。
应该在什么时候使用env函数?
Laravel框架提供了配置缓存的功能,使用 php artisan config:cache
命令即可将config文件夹下所有的配置文件存储到缓存中,这样能避免多个配置文件的反复读取,提高一定的性能。并且在执行后,将不再支持使用env函数以动态的方式读取.env文件中的配置信息。
因此,请勿将env函数等价于define或const函数。除了config文件夹下的配置文件,不应在任何其他地方使用env函数,而是使用config函数代替。
示例:某个控制器方法需要从.env配置文件读取logo图片的url
// .env文件
LOGO_URL=https://whsand.com/logo.png
<?php
namespace App\Http\Controllers;
class logoController extends Controller
{
public function getUrl(){
return env('LOGO_URL');
}
}
上面的getUrl方法中使用了env('LOGO_URL')
来获取.env文件中配置的LOGO_URL,在测试环境时可能是正常的,但是到了正式环境执行过php artisan config:cache
命令之后,env('LOGO_URL')
将返回null,导致出现故障。
正确且优雅的使用方式:
在config文件夹下创建custom.php文件:
// custom.php文件
// 文件名称可自定义
<?php
return [
'logo' => [
'url' => env('LOGO_URL','default')
]
];
改造控制器方法:
<?php
namespace App\Http\Controllers;
class logoController extends Controller
{
public function getUrl(){
return config('custom.logo.url');
}
}
config函数将从config文件夹的配置文件读取配置,使用方法为:
config('文件名称 . 配置项')
,可以使用点号 . 表示配置的数组层级。
这样改造不论是否执行过配置缓存命令,都能顺利获取到.env文件中配置的LOGO_URL,即代码能够同时适应测试环境和生产环境。
配置缓存发生了什么?
执行php artisan config:cache
命令之后,Laravel框架将会把config文件夹下所有的配置文件缓存到bootstrap/cache/config.php
文件中:
// bootstrap/cache/config.php文件
<?php
return
array (
'app' =>
array(
//此处省略框架自带配置
),
'database' =>
array(
//此处省略数据库配置
),
'custom' =>
array (
'logo' =>
array(
'url' => 'https://whsand.com/logo.png',
),
),
);
可以看出配置缓存的原理并不复杂,只是将config文件夹下的所有文件都集中到一个文件中,并且在此过程中会自动执行函数或表达式获取最终的静态结果。这样做的好处是只需要缓存bootstrap/cache/config.php
一个文件即可,减小了检索不同配置文件的性能开销。如果缓存使用redis或memcache等内存驱动,将不会创建bootstrap/cache/config.php
文件,而是直接缓存在内存中,实现更快的读取调用。
其他建议
如果改动了.env文件的配置信息,需要重新执行php artisan config:cache
来刷新缓存;
如果希望取消配置缓存,改为动态读取,则需要执行php artisan config:clear
。这将删除缓存文件,重新启用支持env函数动态读取.env文件。
强烈建议在生产环境开启配置缓存。 当配置文件足够大或配置项足够多时,配置缓存能够显著提高性能。