Envoyer零停机部署实战教程
Envoyer 的“零停机部署”并非开箱即用的魔法功能,而是依赖符号链接原子切换、独立发布目录与严格配置的共享路径(如 .env 和 storage)三者精密协同的结果;真正实现无缝更新的关键在于:数据库迁移必须在 current 切换前完成且保持向前兼容,共享文件需手动上传并正确映射,而队列和定时任务必须通过 Supervisor 或 Cron 主动重启或指向 current 路径——任何一环疏漏(比如在 After 阶段执行 migrate、遗漏 shared 配置或忽略健康检查盲区),都可能引发静默故障、500 错误或后台任务停滞,让看似成功的部署暗藏线上危机。

Envoyer 本身不提供“零停机”的魔法开关,它只是把一套已被验证的原子化发布流程封装成了图形界面。真正起作用的是符号链接切换 + 独立发布目录 + 共享路径隔离 —— 这三者缺一不可。如果你在 Envoyer 面板里勾了“Zero Downtime Deployment”但没配对共享目录或迁移仍在新代码加载后执行,那还是会有请求失败。
为什么 current 软链切换能实现零停机
PHP-FPM 处理每个请求时,会根据 Nginx 的 root /home/forge/example.com/current/public 去加载文件。只要 current 指向的是一个完整、已安装依赖、已运行迁移、已生成缓存的目录,切换动作(ln -nfs releases/20260429123456 current)就是纳秒级的。用户不会感知到任何中断,因为旧进程还在处理完手头请求,新请求立刻落到新代码上。
容易踩的坑:
- 没把
.env和storage/设为共享路径 → 新 release 目录读不到配置或上传文件,直接报错 - 在 Envoyer 的“After”阶段才跑
php artisan migrate→ 此时current已切过去,旧代码可能还在执行,而新迁移已改表结构,导致 500 - 启用了“Run migrations in queue”,但队列进程没配置为优雅重启 → 迁移卡在队列里,或者旧 worker 仍用老代码执行任务
php artisan migrate 必须在 current 切换前完成
Envoyer 默认把迁移放在“Deploy”阶段末尾,也就是新目录准备就绪但尚未激活时。这是安全窗口:代码已就位,数据库还没动,旧服务照常运行。你必须确认这个阶段确实执行了迁移,并且迁移本身是向前兼容的。
关键检查点:
- 打开项目设置 → “Deployment Scripts” → 找到 “Before” 或 “Deploy” 区块,确认有
php artisan migrate --force且不在 “After” - 如果迁移含破坏性操作(如删字段、改类型),务必拆成两步:先加字段并兼容旧逻辑,上线后再删;Envoyer 不会帮你做语义分析
- 避免在迁移里写
DB::table(...)->get()加载大量数据 —— 这会阻塞部署,超时后 Envoyer 可能标记失败并回滚
共享路径(shared)不是可选项,是强制项
Envoyer 在服务器上自动创建 /home/forge/example.com/shared,但不会自动把你的 .env 或 storage 放进去。你得手动上传并配置路径映射,否则每次部署都会覆盖掉这些运行时必需的数据。
正确做法:
- 首次部署前,把生产
.env上传到/home/forge/example.com/shared/.env - 在 Envoyer 设置页 → “Shared Files” 里填入:
.env,storage(注意不带斜杠) - 确保
storage目录权限为775,属主是forge:www-data,否则新 release 下的php artisan storage:link会失败 - 不要在 “Deployment Script” 里写
cp -r shared/storage ./storage—— Envoyer 会在每次部署时自动软链,重复操作反而可能破坏结构
队列与定时任务不随 current 自动更新
Nginx 请求走的是 PHP-FPM,它每次请求都重新加载 current 下的代码;但 php artisan queue:work 是长进程,启动后就锁死了当时的代码路径。你切了 current,它还跑在上个 release 里。
解决方案只有两个:
- 在 Envoyer 的 “After” 脚本里加:
sudo supervisorctl reread && sudo supervisorctl update && sudo supervisorctl restart myapp-queue(假设你用 Supervisor 管理) - 或者更稳妥地,在 “Before” 阶段就停掉旧队列:
sudo supervisorctl stop myapp-queue,再在 “After” 启动新队列 - 同理,
php artisan schedule:run如果是用 Cron 调用的,需确认 Cron 条目里路径写的是/home/forge/example.com/current/artisan,而不是固定死的某个 release 目录
最常被忽略的一点:Envoyer 的“健康检查”默认只访问 / 返回 200 就算成功。但它不校验数据库连接、缓存是否生效、队列是否已重启。一次看似成功的部署,可能让后台任务静默失效数小时——直到你发现邮件没发、通知没推、统计漏了数据。
到这里,我们也就讲完了《Envoyer零停机部署实战教程》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!
实现一个支持“优先级队列”与“自动垃圾回收”的高阶 Promise 执行器,需要结合 JavaScript 的异步特性、队列管理以及内存管理机制。以下是一个逐步的实现思路:1. 理解需求优先级队列:确保高优先级的任务先执行。自动垃圾回收:当任务完成或超时后,自动清理不再需要的 Promise 或数据。2. 核心结构设计2.1 队列使用一个优先级队列来管理任务,每个任务包含:priority(优先级
- 上一篇
- 实现一个支持“优先级队列”与“自动垃圾回收”的高阶 Promise 执行器,需要结合 JavaScript 的异步特性、队列管理以及内存管理机制。以下是一个逐步的实现思路:1. 理解需求优先级队列:确保高优先级的任务先执行。自动垃圾回收:当任务完成或超时后,自动清理不再需要的 Promise 或数据。2. 核心结构设计2.1 队列使用一个优先级队列来管理任务,每个任务包含:priority(优先级
- 下一篇
- 三伏天怎么算?入伏日期最准方法
-
- 文章 · php教程 | 14分钟前 | phpenv
- PHPEnv提示No input file specified解决方法
- 205浏览 收藏
-
- 文章 · php教程 | 22分钟前 | Yii框架
- Yii框架数据备份方法及自动脚本操作指南
- 385浏览 收藏
-
- 文章 · php教程 | 24分钟前 |
- PHP根据参数导出数据操作详解
- 191浏览 收藏
-
- 文章 · php教程 | 28分钟前 | XAMPP
- XAMPP多端口配置教程
- 131浏览 收藏
-
- 文章 · php教程 | 31分钟前 | phpenv
- PHPEnv 80端口被占用怎么解决
- 105浏览 收藏
-
- 文章 · php教程 | 46分钟前 | XAMPP
- XAMPP Apache日志设置详解
- 393浏览 收藏
-
- 文章 · php教程 | 49分钟前 |
- PHP错误日志记录方法及配置指南
- 166浏览 收藏
-
- 文章 · php教程 | 56分钟前 | CodeIgniter
- CodeIgniter图表生成技巧与实现方法
- 480浏览 收藏
-
- 文章 · php教程 | 1小时前 | Laravel
- Laravel Blade条件渲染写法教程
- 260浏览 收藏
-
- 文章 · php教程 | 1小时前 |
- PHP cURL怎么用\_PHPcURL学习教程【详解】
- 282浏览 收藏
-
- 文章 · php教程 | 1小时前 |
- PHP存储中文乱码解决方法
- 406浏览 收藏
-
- 文章 · php教程 | 1小时前 | XAMPP
- XAMPP多端口配置教程详解
- 135浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- ChatExcel酷表
- ChatExcel酷表是由北京大学团队打造的Excel聊天机器人,用自然语言操控表格,简化数据处理,告别繁琐操作,提升工作效率!适用于学生、上班族及政府人员。
- 4644次使用
-
- Any绘本
- 探索Any绘本(anypicturebook.com/zh),一款开源免费的AI绘本创作工具,基于Google Gemini与Flux AI模型,让您轻松创作个性化绘本。适用于家庭、教育、创作等多种场景,零门槛,高自由度,技术透明,本地可控。
- 5006次使用
-
- 可赞AI
- 可赞AI,AI驱动的办公可视化智能工具,助您轻松实现文本与可视化元素高效转化。无论是智能文档生成、多格式文本解析,还是一键生成专业图表、脑图、知识卡片,可赞AI都能让信息处理更清晰高效。覆盖数据汇报、会议纪要、内容营销等全场景,大幅提升办公效率,降低专业门槛,是您提升工作效率的得力助手。
- 4869次使用
-
- 星月写作
- 星月写作是国内首款聚焦中文网络小说创作的AI辅助工具,解决网文作者从构思到变现的全流程痛点。AI扫榜、专属模板、全链路适配,助力新人快速上手,资深作者效率倍增。
- 6794次使用
-
- MagicLight
- MagicLight.ai是全球首款叙事驱动型AI动画视频创作平台,专注于解决从故事想法到完整动画的全流程痛点。它通过自研AI模型,保障角色、风格、场景高度一致性,让零动画经验者也能高效产出专业级叙事内容。广泛适用于独立创作者、动画工作室、教育机构及企业营销,助您轻松实现创意落地与商业化。
- 5236次使用
-
- PHP技术的高薪回报与发展前景
- 2023-10-08 501浏览
-
- 基于 PHP 的商场优惠券系统开发中的常见问题解决方案
- 2023-10-05 501浏览
-
- 如何使用PHP开发简单的在线支付功能
- 2023-09-27 501浏览
-
- PHP消息队列开发指南:实现分布式缓存刷新器
- 2023-09-30 501浏览
-
- 如何在PHP微服务中实现分布式任务分配和调度
- 2023-10-04 501浏览

