切换环境的必要性
我们的代码总会有关于数据库的配置、接口地址的配置等内容,而这些配置会随环境的不同而不同,即开发环境连接开发数据库和开发用的接口,测试环境连接测试库,生产环境连接正式库。因此,当代码从开发环境发布到测试环境或生产环境时,定义这些常量配置的php文件都无法纳入版本库管理,且需要手动修改,这就给发布上线带来了麻烦。
为了简化这一步骤,有两种做法,分别是文件软链接和服务器环境变量设置。
1. 文件软链接
原理:通过在不同的环境创建不同目标文件的同名软链接,实现读取不同的配置。
- 定义多个不同的配置文件,如database.test.php和database.product.php,里面的内容基本一致,不同的是database.test.php里的数据库连接信息是测试库的,而database.product.php里的数据库信息是正式库的。
- 如果你的项目里存在database.php(就是那个因为环境变化而不得不手动修改的文件),把它的路径添加到.gitignore文件里,忽略掉它。
- 在测试环境和生产环境,将代码解压或发布之后,分别建立统一的软链接。
ln -s /code/path/database.test.php /code/path/database.php
这样,程序还是读取database.php文件,但是测试环境和生产环境由于软链接的目标文件不同,从而实现了读取不同的配置。
2. 服务器环境变量设置
原理:通过对不同环境的服务器配置相同键不同值的环境变量,在php代码里通过getenv函数来判断环境,从而在代码层面控制加载不同配置。
1. apache设置
修改域名对应的vhost文件,增加SetENV一行。
格式:SetENV 变量名 变量值
<VirtualHost *:80>
ServerName www.example.com
RewriteEngine on
DocumentRoot /code/path
<Directory '/code/path'>
Options Indexes FollowSymLinks
AllowOverride none
Require all granted
DirectoryIndex index.php
</Directory>
SetENV ENV test
</VirtualHost>
2. nginx设置
1.打开/etc/profile文件:vim /etc/profile
新增一个环境变量export ENV="test",正式服务器设置为="product"
这样通过系统环境变量来做一些不同的操作,或者存在不同的数据库账号密码
设置完后重新加载:source /etc/profile
2.修改PHP的php-fpm.conf文件,设置PHP环境变量
底部增加:env[ENV]=$PHP_ENV
重启PHP服务,service php-fpm restart
3.如果getenv('ENV')无法获取值?
可能因为php.ini默认不载入$_ENV变量定义,如果此时查看phpinfo(),会发现我们设置的环境变量为"no value"
修改vim /etc/php/php.ini
修改:variables_order:variables_order="EGPCS"
重启PHP服务
3. php读取判断
通过getenv()或apache_getenv()读取
var_dump(getenv("ENV"));
var_dump(apache_getenv("ENV"));
if (getenv("ENV") == "product") {
//加载生产环境文件
} else {
//加载测试或开发环境文件
}
网友评论