laravel5已经设计了环境管理功能:
使用HTTP时只需要在apache或nginx中添加APP_ENV=环境名 即可(当然比较麻烦,每个服务器环境都需要配置),如果使用artisan 命令行方式只需要在命令中追加参数 --env=环境名 即可。但并未做到不同环境取不同配置的功能,需要额外增加代码即可。
在HTTP方式中,如果对每个服务器添加 环境变量 虽然可行,可给域名留下随意配置的借口,给后续通过域名就能区分环境留下不便,在这里推荐一个办法,使用域名的后缀来定义环境,极大的方便域名区分环境,同时也不需要在服务器中配置 环境变量,给搭建环境提供方便。
使用域名进行区分环境的好处是不同的域名可以直观看出这是哪个环境。
以域名 www.laravel.com 为例:
各环境域名要求如下:
本地环境: www.laravel.loc
开发合成环境:www.laravel.dev
测试环境: www.laravel.test
预发环境:www.laravel.pre
正式生产环境:www.laravel.com
其中开发环境,测试环境匀可以在公共路由配置hosts,方便大家使用。
增加代码:
在 bootstrap/目录下增加文件 env.php 并增加代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
<?php
//域名配置
$env_hosts
= [
'local'
=> [
'www.laravel.loc'
],
'develop'
=> [
'www.laravel.dev'
],
'test'
=> [
'www.laravel.test'
],
'production'
=> [
'www.laravel.com'
],
];
//环境处理
if
(!
$app
->runningInConsole()) {
//HTTP形式
if
(
empty
(
$_SERVER
[
'HTTP_HOST'
])) {
die
(
'[error] no host'
);
}
foreach
(
$env_hosts
as
$env
=>
$hosts
) {
if
(in_array(
$_SERVER
[
'HTTP_HOST'
],
$hosts
)) {
$app_env
=
$env
;
break
;
}
}
}
else
{
//其它形式
$app_env
=
$app
->detectEnvironment(
function
() {
return
'production'
;
});
}
if
(
empty
(
$app_env
) ||
empty
(
$env_hosts
[
$app_env
])) {
die
(
'[error] no environment'
);
}
//写入环境配置
Dotenv::setEnvironmentVariable(
'APP_ENV'
,
$app_env
);
Dotenv::setEnvironmentVariable(
'APP_HOST'
,
$env_hosts
[
$app_env
][0]);
$app
->loadEnvironmentFrom(env(
'APP_ENV'
) .
'.env'
)
->useEnvironmentPath(base_path(
'env'
));
|
在bootstrap/app.php文件中增加一行:(注意位置,一定要在Illuminate\Foundation\Application实例化之后)
1
|
require_once
__DIR__.
'/env.php'
;
|
如下:
在框架的根目录创建 env 目录并添加如下几个文件:内容可以直接复制 .env 文件
local.env
develop.env
testing.env
pretest.env
production.env
现在可以在任意controller中测试环境变量是否OK:
在不同的环境文件中修改配置: APP_KEY 的值。
1
|
var_dump(app()[
'env'
],env(
'APP_KEY'
));
die
;
|
注意:使用这种方式配置环境需要额外增加几个环境配置文件,当有一个在变动时,其它的几个就有可能需要跟着变动,如果几个环境中完全不会变的配置,就无需添加到环境配置中,使用这种方式配置的环境。
在调用 artisan 命令时如果命令中执行代码有涉及到环境,那么都需要添加上环境参数,如:
1
|
php artisan queue:listen --
env
=production
|
否则命令行会引用错误环境配置,导致程序异常。
注意:laravel5各个小版本包括 lumen 会有些差异主要是 Dotenv::setEnvironmentVariable 方式有两种版本:
静态方式调用版:(laravel 5.0 , laravel 5.1)
1
|
Dotenv::setEnvironmentVariable(
'APP_ENV'
,
$app_env
);
|
实例化方式调用版:(laravel 5.2 , lumen)
1
2
|
$load
=
new
Dotenv\Loader(
''
);
$load
->setEnvironmentVariable(
'APP_ENV'
,
$app_env
);
|
使用时注意当前版本。