守护模式更新代码要到服务器上操作,如果开发人员没有服务器权限就不好办。
只能退而求其次,使用Supervisor之类的不加-d运行,但这种模式有个弊端,每次更新代码都会短暂502,好像还没好的办法解决(需要多套程序负载均衡)。
问了AI,可以定时检测目录下reload、restart两个文件,有就执行相关命令。
试了下,这种方案可行。
有没有办法在框架层面实现类似的?在Master进程应该能做到吧
#!/bin/bash
# ===================== 项目路径配置 =====================
PROJECTS=(
"/www/wwwroot/project1"
"/www/wwwroot/project2"
"/www/wwwroot/project3"
)
# ======================================================
PHP_BIN="php"
LOG_DIR="/var/log/webman_manager"
mkdir -p "$LOG_DIR"
# 每天一个日志文件
LOG_FILE="$LOG_DIR/webman_manager_$(date +%Y-%m-%d).log"
# 日志输出函数
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
}
# 自动清理 7 天前日志
find "$LOG_DIR" -name "webman_manager_*.log" -mtime +7 -delete
log "===== 开始检测项目 ====="
# 遍历项目
for PROJECT in "${PROJECTS[@]}"; do
if [ ! -d "$PROJECT" ]; then
log "项目不存在,跳过:$PROJECT"
continue
fi
if [ ! -f "$PROJECT/start.php" ]; then
log "非 Webman 项目,跳过:$PROJECT"
continue
fi
# ==================== reload 平滑重启 ====================
if [ -f "$PROJECT/reload" ]; then
log "检测到 reload,执行平滑重启:$PROJECT"
# 执行并把输出 全部写入日志
cd "$PROJECT"
$PHP_BIN start.php reload >> "$LOG_FILE" 2>&1
rm -f "$PROJECT/reload"
log "reload 执行完成,文件已删除"
fi
# ==================== restart 强制重启 ====================
if [ -f "$PROJECT/restart" ]; then
log "检测到 restart,执行强制重启:$PROJECT"
# 执行并把输出 全部写入日志
cd "$PROJECT"
$PHP_BIN start.php restart >> "$LOG_FILE" 2>&1
rm -f "$PROJECT/restart"
log "restart 执行完成,文件已删除"
fi
done
log "===== 本轮检测完成 ====="
你可以在gitea或github的webhook针对分支设置回调勾子,请求你的项目地址,在接口接收到合并请求或master、product分支推送的操作类型时,推送队列消费执行sehll命令重启服务。
这样可以实现服务随代码变更自动重启