webman 使启动命令支持启用不同环境

Caesar-Tang

webman 通过启动命令启用开发或生产环境

很多时候,我们都会把关键信息放在一处进行配置,如:通过 .env 来配置 app_debug 开关或数据库信息等,方便管理及部署。
我们通常有两种或多种环境用于开发或生产,并在部署时使用对应的配置文件。
但如果我们只用一个配置文件,并期望在启动命令中通过输入参数的方式,来决定启用开发还是正式环境,该如何处理呢?下面给大家分享下自己的方法,仅供参考。

一. 方案优势

1. 方便 在一个配置中使用多个环境
2. 方便 在启动时启用某个环境
3. 同样适用于 docker 和 supervisor 部署

二. 方案劣势

1. 需要修改框架的原始文件(start.php)
2. 不适用于 windows 上的 php windows.php 命令

三. 解决方案

1. 安装 Env 环境变量组件
composer require vlucas/phpdotenv
2. 项目根目录新建.env文件,并增加你的配置,如:

截图

3. 修改配置处的引用,注意某些区别环境的配置,如:

服务配置:
截图
应用配置:
截图

4. 修改框架的原始文件(start.php),将命令行中的变量写入环境变量:
// 解析命令行启动参数
foreach ($argv as $key=>$value) {
    // 写入环境变量
    if( $value==='-e' && array_key_exists(($key+1), $argv) && str_contains($argv[($key+1)], '=') ) {
        putenv($argv[($key+1)]);
    }
}

截图

5.通过 -e 命令来启用开发或正式环境:
测试:php start.php start -e APP_ENV=DEV
正式:php start.php start -e APP_ENV=PROD

截图
截图

四. docker 部署(Dockerfile)

1. 基于 CentOS:7 + PHP8.1
FROM centos:7

# app env
ENV APP_ENV=DEV

# install yum-utils
RUN yum -y install yum-utils

# install libevent
RUN yum -y install libevent libevent-devel

# install php8.1 libs
RUN yum -y install epel-release
RUN yum -y install https://mirrors.aliyun.com/remi/enterprise/remi-release-7.rpm
RUN yum-config-manager --enable remi-php81
RUN yum -y install php-cli php-event php-posix php-pcntl php-zip php-openssl php-devel php-gd php-mbstring php-curl php-xml php-simplexml php-fileinfo php-sodium php-pear php-bcmath php-json php-mysqlnd php-redis php-amqp php-imagick  --skip-broken

# copy project
RUN mkdir /app
COPY ./ /app
RUN chmod -R 777 /app/public /app/runtime

# install composer
# RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# RUN composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
# RUN composer install --no-dev --working-dir=/app

# clean all
RUN yum clean all

EXPOSE 8787

CMD php /app/start.php start -e APP_ENV="$APP_ENV"
2. 如何修改 PHP 版本:
修改 Dockerfile 中的 "RUN yum-config-manager --enable remi-php81" 行中的 "remi-php81" 即可。 该信息表示 PHP 的版本, 如 使用 PHP8.0, 将其修改 "remi-php80"。
3. 如何修改 PHP 扩展:
添加或删除 Dockerfile 中的 "RUN yum -y install php-cli..." 行中的 PHP 扩展即可。PHP 扩展格式为 php-扩展名, 如 添加 redis 扩展, 在该行增加 "php-redis"。(当前 Dockerfile 中已添加了该扩展)
4. 注意事项:
(1)按需安装扩展,若教程中的扩展您不需要,请删除
(2)按需安装 composer 及依赖,若您代码中已安装依赖,请删除或注释教程中 install composr 部分
(3)若安装过程中出现超时问题,请配置镜像加速,具体参见:https://www.runoob.com/docker/docker-mirror-acceleration.html

五. Docker 容器化部署

1. Docker 构建镜像:
1. 将 Dockerfile 放入应用跟目录
2. 运行制作镜像(镜像名称按 开发者/应用:版本):
docker build --rm -t caesartang/app:1.0 .
2. Docker 运行命令:
1. 使用镜像创建容器:
    docker run -d --restart=always --name=app -p 8787:8787 -e APP_ENV=DEV caesartang/app:1.0
    参数说明:
    -d:后台方式运行
    --restart=always:自启动(必须)
    --name=app:容器服务名称(必须)
    -p:映射端口(将外部端口映射到容器内部端口)(必须)
    -e:环境变量
        APP_ENV=DEV 应用环境(DEV:开发 PROD:正式 默认:DEV)

2. 容器服务操作
    (1) 查看容器状态
    docker ps -a
    (2) 进入容器
    docker exec -it app /bin/bash
    (3) 重启服务
    docker restart app
    (4) 关闭服务
    docker stop app
    (5) 容器状态
    docker stats

六. 总结

流程上大致以下步骤:
1. 通过 .evn 的 APP_ENV 来区别开发环境
2. 在框架的 start.php 中,获取命令行上的 -e 参数并写入环境变量
3. 写入的环境变量,会覆盖掉 .env 中的配置
实际上,通过该方式,可以覆盖 .env 中的所有配置。该方案在 windows 及 linux 均已测试。使用 docker 还是 supervisor 部署,是一样的。
2412 3 10
3个评论

askuiop

好像运行 composer update , 就会重新生成 start.php , 之前的修改就会丢失, 怎么办 ?

今天不抽烟

app.debug 设置为 getenv(getenv('APP_ENV') . '_APP_DEBUG')
读取的值不生效

  • 暂无评论
lsmir2

可以不用写在start.php 文件 可以写在 config/server.php 文件 写个初始化接口 放在server.php里加载即可

  • 暂无评论

Caesar-Tang

750
积分
0
获赞数
0
粉丝数
2022-03-28 加入
×
🔝