程序员

PHP通过区分开发、测试、生产环境来简化发布流程

2022-03-07  本文已影响0人  玩物励志老乐

切换环境的必要性

我们的代码总会有关于数据库的配置、接口地址的配置等内容,而这些配置会随环境的不同而不同,即开发环境连接开发数据库和开发用的接口,测试环境连接测试库,生产环境连接正式库。因此,当代码从开发环境发布到测试环境或生产环境时,定义这些常量配置的php文件都无法纳入版本库管理,且需要手动修改,这就给发布上线带来了麻烦。
为了简化这一步骤,有两种做法,分别是文件软链接和服务器环境变量设置。

1. 文件软链接

原理:通过在不同的环境创建不同目标文件的同名软链接,实现读取不同的配置。

  1. 定义多个不同的配置文件,如database.test.php和database.product.php,里面的内容基本一致,不同的是database.test.php里的数据库连接信息是测试库的,而database.product.php里的数据库信息是正式库的。
  2. 如果你的项目里存在database.php(就是那个因为环境变化而不得不手动修改的文件),把它的路径添加到.gitignore文件里,忽略掉它。
  3. 在测试环境和生产环境,将代码解压或发布之后,分别建立统一的软链接。
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 {
  //加载测试或开发环境文件
}
上一篇下一篇

猜你喜欢

热点阅读