diff --git a/deploy_update.sh b/deploy_update.sh index eed959b..e413b6c 100644 --- a/deploy_update.sh +++ b/deploy_update.sh @@ -90,17 +90,26 @@ php artisan horizon:terminate # 7. 重启 Reverb,确保长驻 WebSocket 进程加载最新代码和配置 echo -e "${YELLOW}[7/8] 重启 Reverb...${NC}" REVERB_RESTARTED=0 +REVERB_CAN_AUTO_RESTART=0 +SUPERVISOR_REVERB_TARGETS="" -# Laravel 官方推荐:部署后使用 reverb:restart 优雅重启长驻进程 -php artisan reverb:restart >/dev/null 2>&1 -if [ $? -eq 0 ]; then - REVERB_RESTARTED=1 - echo -e "${GREEN}✅ 已执行 php artisan reverb:restart。${NC}" -fi - -# 若线上通过 Supervisor 托管 reverb:start,继续尝试重启常见进程名 +# 先探测是否存在可自动拉起 Reverb 的进程管理器,避免在纯手工启动场景下执行 reverb:restart 后把聊天室停掉。 if command -v supervisorctl >/dev/null 2>&1; then SUPERVISOR_REVERB_TARGETS=$(supervisorctl status 2>/dev/null | awk '/reverb|broadcast|websocket/ {print $1}') + if [ -n "$SUPERVISOR_REVERB_TARGETS" ]; then + REVERB_CAN_AUTO_RESTART=1 + fi +fi + +# Laravel 官方文档说明:reverb:restart 适合在 Supervisor 等进程管理器托管下使用。 +if [ "$REVERB_CAN_AUTO_RESTART" -eq 1 ]; then + php artisan reverb:restart >/dev/null 2>&1 + if [ $? -eq 0 ]; then + REVERB_RESTARTED=1 + echo -e "${GREEN}✅ 已执行 php artisan reverb:restart。${NC}" + fi + + # 若线上通过 Supervisor 托管 reverb:start,再补一次显式 restart,尽量确保进程被拉起。 if [ -n "$SUPERVISOR_REVERB_TARGETS" ]; then while IFS= read -r target; do if [ -n "$target" ]; then @@ -110,10 +119,9 @@ if command -v supervisorctl >/dev/null 2>&1; then done <<< "$SUPERVISOR_REVERB_TARGETS" echo -e "${GREEN}✅ 已尝试重启 Supervisor 托管的 Reverb 相关进程。${NC}" fi -fi - -if [ "$REVERB_RESTARTED" -eq 0 ]; then - echo -e "${YELLOW}⚠️ 未检测到可自动重启的 Reverb 进程,请手动确认 reverb:start / Supervisor 状态。${NC}" +else + echo -e "${YELLOW}⚠️ 未检测到 Reverb 进程管理器,已跳过 reverb:restart,避免把手工启动的聊天室长连接服务停掉。${NC}" + echo -e "${YELLOW}⚠️ 若当前服务器是手工执行 php artisan reverb:start,请在部署完成后手动重启该进程。${NC}" fi # 8. 重载 PHP-FPM / opcache,避免 Web 进程继续使用旧的 autoload 缓存