使用shell脚本同步php环境配置的核心方法是利用scp和rsync命令通过ssh连接实现本地与生产环境的配置文件双向同步,并通过排除特定差异文件、备份配置、重启服务等步骤确保同步的安全性和一致性。
多环境配置参数同步不是复制粘贴,而是让脚本自动识别差异、安全搬运、可靠生效。关键不在命令多复杂,而在路径明确、备份留痕、变更可查。
先定义哪些能同步、哪些必须跳过
不同环境的配置总有不可共享的部分,比如数据库密码、监听IP、日志路径、密钥文件。脚本运行前必须划清边界:
- 用
--exclude明确排除敏感项,例如.env.production、config.local.php、secrets.json - 通用参数(如超时时间、编码格式)放进Git仓库统一管理;环境特有值通过变量注入或独立加载(如PowerShell中用
$env:ENV_NAME动态读取) - 所有路径写绝对路径,避免依赖
$PWD或相对位置导致目标错位
用 rsync + PowerShell 封装稳定分发
PowerShell本身不内置rsync,但在Windows上可通过WSL2或Cygwin调用,更推荐直接在Linux目标机部署rsync服务,由PowerShell发起SSH推送:
- 核心命令示例:
ssh user@192.168.10.5 "mkdir -p /etc/myapp.bak && cp -r /etc/myapp/* /etc/myapp.bak/"(先远程备份) - 再执行:
rsync -avz --delete --checksum --exclude='*.log' ./configs/ user@192.168.10.5:/etc/myapp/ - 批量推送时,用PowerShell读取服务器列表:
Get-Content servers.txt | ForEach-Object { rsync ... $_:/etc/myapp/ }
同步后三步不能省:校验、重启、记日志
跳过任一环节,都可能让一次“成功同步”变成线上故障:
-
语法校验:同步完立刻执行检查,如
ssh user@host "nginx -t"、ssh user@host "php --ini | grep 'Loaded Configuration File'" -
平滑生效:优先用
systemctl reload myapp而非restart;若为Windows服务,可用Restart-Service -Name MyApp -Force并加Start-Sleep 2确认状态 -
结构化日志:每步输出带时间戳、源/目标、文件数、校验结果,重定向到
/var/log/sync-configs.log,同时用logger写入系统日志便于审计
PowerShell里做轻量级参数映射更灵活
当配置文件是JSON/YAML/INI格式,且仅需替换少量字段(如DB_HOST、API_URL),可不用全量同步,而用PowerShell原生解析+更新:
- 读取本地模板:
$config = Get-Content config.template.json | ConvertFrom-Json - 按环境注入值:
$config.database.host = $env:DB_HOST(从环境变量或CSV读取) - 写回目标机:
$config | ConvertTo-Json -Depth 10 | Out-File "\serverc$etcmyappconfig.json" - 适合CI/CD阶段使用,避免传输整套配置,也规避了敏感字段混入版本库的风险











