美文网首页程序员
PHP通过区分开发、测试、生产环境来简化发布流程

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

作者: 玩物励志老乐 | 来源:发表于2022-03-07 16:06 被阅读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 {
      //加载测试或开发环境文件
    }
    

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/jernrrtx.html