当前位置: 首页 > news >正文

Hyperf方案 多环境配置管理

<?php/** * 案例标题:多环境配置管理 * 说明:基于.env文件管理dev/test/prod不同环境配置,运行时根据APP_ENV自动加载对应配置 * 需要安装的包: * composer require hyperf/config * composer require vlucas/phpdotenv */declare(strict_types=1);// ========== .env.dev 文件内容(放项目根目录)==========/* APP_ENV=dev APP_NAME=HyperfApp DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=hyperf_dev DB_USERNAME=root DB_PASSWORD=123456 REDIS_HOST=127.0.0.1 REDIS_PORT=6379 LOG_LEVEL=debug */// ========== .env.prod 文件内容 ==========/* APP_ENV=prod APP_NAME=HyperfApp DB_HOST=10.0.1.100 DB_PORT=3306 DB_DATABASE=hyperf_prod DB_USERNAME=hyperf_user DB_PASSWORD=StrongPassword123! REDIS_HOST=10.0.1.200 REDIS_PORT=6379 LOG_LEVEL=error */// ========== config/autoload/database.php ==========// 数据库配置文件,直接读env变量,不同环境自动切换return['default'=>['driver'=>'mysql','host'=>env('DB_HOST','127.0.0.1'),// 从环境变量读数据库地址'port'=>env('DB_PORT',3306),// 端口默认3306'database'=>env('DB_DATABASE','hyperf'),// 数据库名'username'=>env('DB_USERNAME','root'),// 用户名'password'=>env('DB_PASSWORD',''),// 密码,生产环境记得改强密码'charset'=>'utf8mb4',// 字符集,支持emoji用这个'collation'=>'utf8mb4_unicode_ci','pool'=>['min_connections'=>1,'max_connections'=>(int)env('DB_MAX_CONN',10),// 连接池大小也可以用env控制'connect_timeout'=>10.0,'wait_timeout'=>3.0,'heartbeat'=>-1,'max_idle_time'=>(float)env('DB_IDLE_TIME',60),],],];// ========== config/autoload/app.php ==========// 应用基础配置return['name'=>env('APP_NAME','HyperfSkeleton'),// 应用名称'env'=>env('APP_ENV','dev'),// 当前环境,dev/test/prod'debug'=>env('APP_DEBUG',false),// 调试模式,生产别开'timezone'=>'Asia/Shanghai',// 时区,国内项目固定上海];// ========== app/ConfigProvider.php ==========namespaceApp;classConfigProvider{publicfunction__invoke():array{return['dependencies'=>[],'commands'=>[],'listeners'=>[],];}}// ========== bin/hyperf.php 启动入口,自动加载对应env文件 ==========namespaceApp\Bootstrap;useDotenv\Dotenv;classEnvLoader{/** * 根据APP_ENV环境变量加载对应的.env文件 * 启动时先看有没有 .env.{环境名},有就加载,没有就fallback到.env */publicstaticfunctionload(string$basePath):void{$appEnv=getenv('APP_ENV')?:'dev';// 先从系统环境变量读,没有就默认dev$envFile=".env.{$appEnv}";// 拼出文件名,比如 .env.prodif(file_exists($basePath.'/'.$envFile)){// 找到了对应环境的文件,就加载它Dotenv::createImmutable($basePath,$envFile)->load();}elseif(file_exists($basePath.'/.env')){// 没有对应环境文件,fallback到默认.envDotenv::createImmutable($basePath)->load();}// 两个都没有就算了,靠系统环境变量跑}}// ========== app/Service/ConfigService.php ==========namespaceApp\Service;useHyperf\Contract\ConfigInterface;classConfigService{publicfunction__construct(privateConfigInterface$config// 注入Hyperf配置对象){}/** * 获取当前环境名,方便业务代码判断是不是生产环境 */publicfunctiongetEnv():string{return$this->config->get('app.env','dev');}/** * 判断是不是生产环境,生产环境一些敏感操作要禁掉 */publicfunctionisProduction():bool{return$this->getEnv()==='prod';}/** * 获取数据库配置,调试的时候可以打印出来看看加载的是哪个库 */publicfunctiongetDbConfig():array{return$this->config->get('database.default',[]);}}// ========== app/Controller/ConfigController.php ==========namespaceApp\Controller;useApp\Service\ConfigService;useHyperf\HttpServer\Annotation\Controller;useHyperf\HttpServer\Annotation\GetMapping;#[Controller(prefix:'/config')]classConfigController{publicfunction__construct(privateConfigService$configService){}/** * GET /config/env - 查看当前跑的是哪个环境 * 生产环境记得把这个接口干掉,别暴露配置信息 */#[GetMapping(path:'/env')]publicfunctionenv():array{// 生产环境不允许查配置,防止信息泄露if($this->configService->isProduction()){return['code'=>403,'msg'=>'生产环境禁止访问'];}return['code'=>0,'data'=>['env'=>$this->configService->getEnv(),'db_host'=>$this->configService->getDbConfig()['host']??'unknown',],];}}
http://www.cnnetsun.cn/news/1697594.html

相关文章:

  • Windows下OpenClaw安装避坑指南:Qwen3.5-9B-AWQ-4bit联调实录
  • OpenClaw长期运行优化:Qwen3.5-9B-AWQ-4bit内存泄漏排查
  • 《贾子科学真理主权理论(Truth Sovereignty of Science)》
  • M5Unit-DigiClock模块:基于I²C的即插即用数字时钟解决方案
  • RTOS任务切换机制与触发时机详解
  • 迷彩伪装目标检测数据集VOC+YOLO格式839张1类别
  • PicoBricks-for-ESP32库详解:面向教育的ESP32硬件抽象封装
  • 2006 Text 3
  • OpenClaw深度学习:千问3.5-9B模型微调实战
  • M2LOrder轻量级部署教程:Miniconda torch28环境隔离与依赖冲突解决
  • Go语言的接口与多态
  • NDefs:嵌入式C语言零开销宏库与类型安全实践
  • 嵌入式差分升级技术解析与实践指南
  • (复现)基于自适应滑模控制(ASMC)和神经网络容错控制的主从式无人机编队控制研究(Matlab代码实现)
  • C语言结构体详解:从基础到高级应用
  • Linux系统调用原理与性能优化实践
  • python unique
  • TomServo:嵌入式低功耗多路舵机串行控制库
  • 嵌入式RTP协议栈:面向实时音频的低延迟传输设计
  • STM32异步Web服务器:零拷贝HTTP/WS工业网关实战
  • 【CPP 深度学习】PyTorch On CPP 系列课程 第一章 01 :入门与环境搭建 【Ai Infra 3.0】[PyTorch CPP LibTorch 硕士研一课程]
  • 基于FPGA的TCP乱序重排算法的实战实现与解析:自创算法的Verilog编码及性能验证
  • 深入解析seamless-immutable:特殊对象处理的终极指南
  • LLMLingua未来展望:AI推理加速技术的终极发展趋势
  • VirtualAPK插件监控告警终极指南:钉钉/企业微信通知配置
  • GeoIP2-CN的IP段合并工具开发:命令行参数详解
  • STIX Two字体:解决学术文档数学符号显示难题的专业方案
  • Apache NetBeans项目管理技巧:Maven、Gradle与Ant深度整合
  • PromptSource模板动态加载:轻松管理大型提示集合的终极指南
  • WebDataset数据增强流水线:高效集成TorchVision与自定义变换