很多时候,我们都会把关键信息放在一处进行配置,如:通过 .env 来配置 app_debug 开关或数据库信息等,方便管理及部署。
我们通常有两种或多种环境用于开发或生产,并在部署时使用对应的配置文件。
但如果我们只用一个配置文件,并期望在启动命令中通过输入参数的方式,来决定启用开发还是正式环境,该如何处理呢?下面给大家分享下自己的方法,仅供参考。
1. 方便 在一个配置中使用多个环境
2. 方便 在启动时启用某个环境
3. 同样适用于 docker 和 supervisor 部署
1. 需要修改框架的原始文件(start.php)
2. 不适用于 windows 上的 php windows.php 命令
composer require vlucas/phpdotenv
服务配置:
应用配置:
// 解析命令行启动参数
foreach ($argv as $key=>$value) {
// 写入环境变量
if( $value==='-e' && array_key_exists(($key+1), $argv) && str_contains($argv[($key+1)], '=') ) {
putenv($argv[($key+1)]);
}
}
测试:php start.php start -e APP_ENV=DEV
正式:php start.php start -e APP_ENV=PROD
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"
修改 Dockerfile 中的 "RUN yum-config-manager --enable remi-php81" 行中的 "remi-php81" 即可。 该信息表示 PHP 的版本, 如 使用 PHP8.0, 将其修改 "remi-php80"。
添加或删除 Dockerfile 中的 "RUN yum -y install php-cli..." 行中的 PHP 扩展即可。PHP 扩展格式为 php-扩展名, 如 添加 redis 扩展, 在该行增加 "php-redis"。(当前 Dockerfile 中已添加了该扩展)
(1)按需安装扩展,若教程中的扩展您不需要,请删除
(2)按需安装 composer 及依赖,若您代码中已安装依赖,请删除或注释教程中 install composr 部分
(3)若安装过程中出现超时问题,请配置镜像加速,具体参见:https://www.runoob.com/docker/docker-mirror-acceleration.html
1. 将 Dockerfile 放入应用跟目录
2. 运行制作镜像(镜像名称按 开发者/应用:版本):
docker build --rm -t caesartang/app:1.0 .
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 部署,是一样的。
好像运行 composer update , 就会重新生成 start.php , 之前的修改就会丢失, 怎么办 ?
执行 composer update,会更新框架及所有的包,这种情况下,只能再重写 start.php 了。另外,为了避免不必要的风险,建议尽量限制版本约束,以避免意外更新到不兼容的版本。
用官方的方法 https://www.workerman.net/doc/webman/components/env.html
用git 先提交.
composer update
git restore .
app.debug 设置为 getenv(getenv('APP_ENV') . '_APP_DEBUG')
读取的值不生效
可以不用写在start.php 文件 可以写在 config/server.php 文件 写个初始化接口 放在server.php里加载即可