使用 Deployer 零停机部署 CodeIgniter 4:recipe/codeigniter4 完整实战指南
DevOpsCI/CDCLI开发工具运维【免费下载链接】deployerThe PHP deployment tool with support for popular frameworks out of the box项目地址https://gitcode.com/gh_mirrors/de/deployer点击查看免费下载本指南讲解如何在 Deployer 中引入codeigniter4recipe将 CodeIgniter 4 应用以零停机、可回滚的方式部署到服务器并自动完成依赖安装、.env配置、目录权限、生产优化与数据库迁移。读完本文你将掌握 CodeIgniter 4 部署所需的全部配置项、内置 spark 任务链、自定义 spark 命令的调用方式以及底层源码级的工作原理。CodeIgniter 4 部署的核心特性Deployer 是一个用 PHP 编写的免费开源部署工具recipe/codeigniter4.php是官方为 CodeIgniter 4 应用定制的部署配方recipe。使用该配方只需一行require即可获得完整的部署能力require recipe/codeigniter4.php;该配方为 CodeIgniter 4 应用带来三大核心能力Provisioning服务器供给可直接对服务器进行初始化配置需配合 provision recipe 使用Zero downtime deployment零停机部署通过新版本发布目录 原子切换 symlink的方式切换流量部署期间服务不中断Rollbacks回滚若发布出错可一键回滚到上一个可用版本。除此之外Deployer 本身还具备简单直观的 DSL 语法、基于并行 SSH 连接的高执行速度、全程通过 SSH 的安全通道以及对主流 PHP 框架的开箱即用支持。部署前建议先阅读 Getting Started 完成 Deployer 的安装与项目初始化dep init并参考 installation.md 确认运行环境要求。快速开始初始化 CodeIgniter 4 部署在 CodeIgniter 4 项目根目录执行dep init并按提示选择codeigniter4recipe 后deploy.php的核心结构如下?php namespace Deployer; require recipe/codeigniter4.php; // 主机定义 host(example.org) -set(remote_user, deployer) // SSH 用户名 -set(deploy_path, ~/example); // 服务器上的部署根目录必填 // 代码仓库 set(repository, gitgithub.com:you/codeigniter4-app.git); // 部署 task(deploy, [ deploy:prepare, deploy:vendors, spark:optimize, spark:migrate, deploy:publish, ]);其中deploy_path是必填项未设置时会在部署时抛出ConfigurationException见 recipe/common.php 中set(deploy_path, ...)的默认抛错逻辑。随后执行dep deploy即可一键部署。若需要从某个环节继续可配合--start-from选项例如dep deploy --start-from deploy:migrate。deploy 主任务完整流程拆解recipe/codeigniter4.php中的deploy任务源码见 recipe/codeigniter4.php是一个组任务group task按顺序包含五个阶段deploy:prepare → deploy:vendors → spark:optimize → spark:migrate → deploy:publish各阶段职责如下阶段一deploy:prepare准备新版本来自 common recipe本身也是组任务展开后包含 8 个子任务deploy:info—— 展示本次部署相关信息主机、仓库、分支等见 docs/recipe/deploy/info.mddeploy:setup—— 在服务器上创建deploy_path目录骨架见 docs/recipe/deploy/setup.mddeploy:lock—— 获取部署锁防止并发部署互相覆盖见 docs/recipe/deploy/lock.mddeploy:release—— 生成新的 release 编号并创建发布目录见 docs/recipe/deploy/release.mddeploy:update_code—— 通过 git 拉取指定分支/提交到 release 目录见 docs/recipe/deploy/update_code.mddeploy:env—— 配置.env文件若 release 目录中不存在.env而存在{{dotenv_example}}默认.env.example则复制一份实现见 recipe/deploy/env.phpdeploy:shared—— 为共享目录/文件创建符号链接见下文共享与权限配置deploy:writable—— 设置可写目录权限见下文。阶段二deploy:vendors安装依赖执行 Composer 安装依赖。默认动作为install默认选项为--verbose --prefer-dist --no-progress --no-interaction --no-dev --optimize-autoloader见 recipe/deploy/vendors.php即生产环境安装、跳过 dev 依赖并优化自动加载。若服务器上找不到 ComposerDeployer 会自动将 Composer 安装到{{deploy_path}}/.dep/composer.phar。阶段三spark:optimize生产优化执行 CodeIgniter 4 的spark optimize命令对应用进行生产环境优化配置缓存、路由缓存等仅在 CodeIgniter 4.5.0 及以上版本可用源码中通过min 4.5.0限制。阶段四spark:migrate数据库迁移执行spark migrate --all运行所有未执行过的数据库迁移并带有skipIfNoEnv保护若.env文件缺失或为空则跳过并给出警告而非中断部署。阶段五deploy:publish发布版本来自 common recipe展开后包含 4 个子任务deploy:symlink—— 将current符号链接原子切换到新 release实现零停机切换见 docs/recipe/deploy/symlink.mddeploy:unlock—— 释放部署锁见 docs/recipe/deploy/lock.mddeploy:cleanup—— 按keep_releases默认 10清理过期 release见 docs/recipe/deploy/cleanup.mddeploy:success—— 输出成功信息。配置项详解codeigniter4recipe 定义或覆盖了以下配置参数全部可在deploy.php中用set()二次覆盖。public_pathWeb 服务器文档根目录相对于 release 目录覆盖自 provision/website 配方set(public_path, public);CodeIgniter 4 的入口文件位于public/目录部署后 Web 服务器如 Nginx应将root指向current/publicroot /home/deployer/example/current/public; index index.php; location / { try_files $uri $uri/ /index.php?$query_string; }shared_dirs共享目录set(shared_dirs, [writable]);writable/目录存放 CodeIgniter 4 的运行时文件缓存、日志、会话、上传等必须在各 release 之间共享否则每次发布都会丢失运行数据。deploy:shared任务的处理逻辑见 recipe/deploy/shared.php若{{deploy_path}}/shared/writable不存在则创建它并把 release 中已有的writable目录内容拷贝进去删除 release 中的原目录在 release 中创建指向shared/writable的符号链接。shared_files共享文件set(shared_files, [.env]);.env存放数据库凭据、encryption key 等环境敏感配置同样以符号链接形式在 release 间共享首次部署时把 release 内的.env若存在复制到shared/.env此后所有 release 统一通过 symlink 引用同一份文件。这也解释了spark系列任务中skipIfNoEnv/failIfNoEnv选项的意义——.env是独立于代码仓库的共享资产。writable_dirs可写目录set(writable_dirs, [ writable/cache, writable/debugbar, writable/logs, writable/session, writable/uploads, ]);列出需要 Web 服务器可写的子目录。deploy:writable任务会先mkdir -p确保目录存在再按writable_mode设置权限默认acl其他可选值见 recipe/deploy/writable.phpchown、chgrp、chmod、acl、sticky、skip。http_user/http_group会在进程列表中自动探测 Apache/Nginx 用户探测失败时可在deploy.php中显式指定。log_files日志文件set(log_files, writable/logs/*.log);指定应用日志文件路径支持通配符供 common recipe 中的logs:app任务使用——运行dep logs:app可通过tail -f实时跟踪 CodeIgniter 4 的日志输出。codeigniter4_version版本自动检测set(codeigniter4_version, function () { $result run({{bin/php}} {{release_or_current_path}}/spark); preg_match_all(/(\d\.?)/, $result, $matches); return $matches[0][0] ?? 5.5; });在远程执行php spark解析输出中的第一个版本号用于判断当前 CodeIgniter 4 版本从而决定带min/max版本限制的 spark 任务是否执行解析失败时回退到默认值5.5。bin/php来自 common recipe默认为which php也可通过主机级php_version配置指定特定版本。spark() 辅助函数版本门控与环境保护codeigniter4recipe 通过源码中的辅助函数spark($command, $options)见 recipe/codeigniter4.php统一封装了对 CodeIgniter 4 CLI 命令php spark ...的调用支持以下选项选项作用min 4.5.0仅当 CodeIgniter 4 版本 ≥ 指定版本时执行版本比较基于codeigniter4_versionmax 4.5.0仅当 CodeIgniter 4 版本 ≤ 指定版本时执行skipIfNoEnv若{{release_or_current_path}}/.env缺失或为空跳过命令并输出警告failIfNoEnv若.env缺失或为空抛出异常终止部署showOutput将命令的远程输出回显到本地终端版本比较通过codeigniter4_version_compare(string $version, string $comparator)实现recipe/codeigniter4.php底层使用 PHP 的version_compare。.env的存在性检测使用test([ -s .../.env ])-s表示文件存在且非空。内置任务速查所有任务均可在命令行直接运行例如dep spark:routes、dep spark:migrate:status。按源码注释recipe/codeigniter4.php分为五类Discover Checks诊断与检查任务对应 spark 命令说明版本限制spark:cache:infocache:info显示文件缓存信息—spark:config:checkconfig:check检查 Config 配置值≥ 4.5.0需.envspark:envenv获取或设置当前环境需.envspark:filter:checkfilter:check检查路由过滤器≥ 4.3.0spark:lang:findlang:find查找待翻译的短语≥ 4.5.0spark:namespacesnamespaces校验命名空间配置—spark:phpini:checkphpini:check检查php.ini配置值≥ 4.5.0spark:routesroutes展示所有路由≥ 4.3.0Actions执行类操作任务对应 spark 命令说明spark:key:generatekey:generate生成新的加密密钥并写入.env需.env非空spark:optimizeoptimize生产环境优化≥ 4.5.0已编入 deploy 主流程spark:publishpublish发现并执行所有预定义的 Publisher 类需.envDatabase and migrations数据库与迁移任务对应 spark 命令说明spark:db:createdb:create创建新的数据库 schemaspark:db:seeddb:seed运行指定 Seeder 填充数据需.envspark:db:tabledb:table查看指定表信息≥ 4.5.0需.envspark:migratemigrate --all运行所有新迁移需.env已编入 deploy 主流程spark:migrate:refreshmigrate:refresh -f --all先回滚再迁移刷新数据库状态需.envspark:migrate:rollbackmigrate:rollback -f回滚上一批次的所有迁移需.envspark:migrate:statusmigrate:status显示所有迁移的执行状态需.envHousekeeping日常维护任务对应 spark 命令说明spark:cache:clearcache:clear清空系统缓存spark:debugbar:cleardebugbar:clear清空所有 Debugbar JSON 文件spark:logs:clearlogs:clear清空所有日志文件spark:custom自定义 spark 命令task(spark:custom, spark(, [showOutput]));用于执行 CodeIgniter 4 中没有被内置任务覆盖的自定义 spark 命令例如 shield、settings 等第三方包的 CLI 命令运行时会回显输出。使用方式示例dep spark:custom -- shield:user create部署后的服务器目录结构一次成功部署后服务器上的deploy_path目录结构如下与 getting-started.md 中描述的通用结构一致~/example // deploy_path ├─ current - releases/2 // 指向当前版本的符号链接 ├─ releases/ │ ├─ 1 // 旧版本cleanup 保留默认 10 个 │ └─ 2 // 最新版本 │ ├─ ... │ ├─ writable - ../../shared/writable // 共享目录 symlink │ └─ .env - ../../shared/.env // 共享文件 symlink ├─ shared/ │ ├─ writable/ // 共享运行数据缓存/日志/会话/上传 │ └─ .env // 共享环境配置 └─ .dep/ // Deployer 内部数据锁、composer.phar 等current是 Web 服务器实际服务的目录。由于切换current是原子 symlink 操作因此发布过程零停机若新版本异常可执行dep rollback回滚到上一 release见 docs/recipe/deploy/rollback.md。总结与扩展阅读codeigniter4recipe 将 CodeIgniter 4 的框架约定public/入口、writable/运行时目录、.env环境配置、sparkCLI与 Deployer 的通用部署模型release 目录 symlink 切换有机结合deploy:prepare负责准备与共享资产deploy:vendors安装 Composer 依赖spark:optimize与spark:migrate完成生产优化与数据库升级deploy:publish原子发布并清理旧版本。整个流程以 common recipe 为基底可进一步按需扩展自定义任务。可继续阅读common recipe 完整参考deploy 子任务系列、shared 共享配置、writable 权限配置、vendors 依赖安装recipe 源码实现赞分享DevOpsCI/CDCLI开发工具运维【免费下载链接】deployerThe PHP deployment tool with support for popular frameworks out of the box项目地址https://gitcode.com/gh_mirrors/de/deployer点击查看免费下载相关推荐FastAPI蓝绿部署实现零停机更新的完整实战指南FastAPI蓝绿部署实现零停机更新的完整实战指南 想要在用户毫无感知的情况下完成系统升级吗 FastAPI蓝绿部署策略正是你需要的解决方案这种先进的文档教程为什么选择XMonad对比主流桌面环境的10个优势分析为什么选择XMonad对比主流桌面环境的10个优势分析 XMonad是一款轻量级、高度可定制的平铺式窗口管理器与GNOME、KDE等传统桌面环境相比它以独delegated-events核心API全解析on、off、fire函数使用指南delegated events核心API全解析on、off、fire函数使用指南 事件委托是构建动态Web应用的终极利器delegated events是上一篇Static-Program-Analysis-Book指针分析完全指南为什么这是现代程序分析的核心技术下一篇HashiCorp Yamux高效Golang连接复用库创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

YOLO番茄检测数据集实战:标签校验、训练避坑与模型部署

YOLO番茄检测数据集实战:标签校验、训练避坑与模型部署

简介:一套基于YOLO的目标检测番茄高清数据集及配套标注文件,面向计算机、电子信息工程、数学等专业学生用于课程设计、期末大作业或毕业设计,图像全部高清实拍,Label标注精确,txt标注可直接用于YOLO系列模型训练与验证…

2026/9/23 14:17:14 阅读更多 →
手机号码归属地查询软件下载源码解析实战指南

手机号码归属地查询软件下载源码解析实战指南

手机号码归属地查询软件下载源码解析实战指南 看了一堆教程还是不会写项目?别慌,这不是你的错,是大部分教程只教你“怎么下”,不教你“怎么改”。 很多人以为 手机号码归属地查询软件下载 就是去某个官网点一下“下载”,或者在 PyPI 上…

2026/9/23 14:17:14 阅读更多 →
步尚雪源码解析:3个环境坑让你少熬2夜

步尚雪源码解析:3个环境坑让你少熬2夜

步尚雪源码解析:3个环境坑让你少熬2夜 配置环境就卡半天,这简直是每个刚接触步尚雪的新人噩梦。我当年为了跑通一个示例项目,把电脑重启了五次,差点把键盘敲烂。别笑,这真不是个例,很多人盯着报错日志发呆,其实问题就出在最基础的依赖加载逻辑上。今…

2026/9/23 14:17:14 阅读更多 →

最新新闻

确定性网络白皮书拆解:FlexE、TSN、DetNet 技术选型与落地避坑指南

确定性网络白皮书拆解:FlexE、TSN、DetNet 技术选型与落地避坑指南

简介:《未来网络白皮书:确定性网络技术体系》由网络通信与安全紫金山实验室联合华为、北京邮电大学等单位编写,面向网络通信研究者、工业互联网从业者及高校师生,系统解答传统“尽力而为”互联网难以满足智能制造、远程医疗、自动…

2026/9/23 16:23:19 阅读更多 →
Goemon64Recomp版本发布状态解析:静态重编译工程的产品化之路

Goemon64Recomp版本发布状态解析:静态重编译工程的产品化之路

1. 项目背景与核心定位拆解1.1 这个项目到底在做什么Goemon64Recomp 是一个围绕经典 N64 平台游戏《大盗五右卫门》系列(Mystical Ninja 系列)进行静态重编译(Static Recompilation)的工程。它的核心目标不是模拟器式的逐指令解释…

2026/9/23 16:23:19 阅读更多 →
基于Python的BERT情感分析实战:从微调训练到GUI部署

基于Python的BERT情感分析实战:从微调训练到GUI部署

简介:基于Python实现的BERT情感分析模型,面向自然语言处理课程设计与情感分析入门者,提供从语料训练到测试验证的完整工程。资源以正向、无情感、负向三分类语料训练模型,训练语料超过1万条,迭代3次后在3000余条测试集…

2026/9/23 16:23:19 阅读更多 →
BERT微调实现多标签文本分类的Keras实战指南

BERT微调实现多标签文本分类的Keras实战指南

简介:基于Keras与Keras-bert的文本多标签分类项目包,面向自然语言处理实战场景,通过微调BERT完成多标签分类,并以2020语言与智能技术竞赛事件抽取任务作为数据样例,适合需要快速落地预训练模型的开发者和研究者。压缩包…

2026/9/23 16:23:19 阅读更多 →
BERT+BiLSTM+CRF中文命名实体识别实战:从数据预处理到模型部署

BERT+BiLSTM+CRF中文命名实体识别实战:从数据预处理到模型部署

简介:面向中文命名实体识别(NER)的Python项目源码,以BERTBiLSTMCRF为核心框架,同时提供BiLSTMCRF、IDCNNCRF等多种对比实现,覆盖数据预处理、模型训练与评估全流程。压缩包共58个文件,以16个Pyt…

2026/9/23 16:23:19 阅读更多 →
高中数学竞赛题实战项目:3步搞定API变更

高中数学竞赛题实战项目:3步搞定API变更

高中数学竞赛题实战项目:3步搞定API变更 版本升级后 API 全变了,代码直接报错?别慌。 在重构这个【高中数学竞赛题】自动判题系统时,我遇到了同样的地狱级现场。 旧版解析库突然废弃了核心接口,导致整个 实战项目 无法运行。…

2026/9/23 16:22:16 阅读更多 →

日新闻

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A…

2026/9/23 0:00:23 阅读更多 →
2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我 刚把开发环境的显示器从1080P换到2K,跑老项目直接报错,版本升级后 API…

2026/9/23 0:01:25 阅读更多 →
3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点 官方文档翻了三遍还是云里雾里?别急,美眉图在实战项目中常被用来做数据可视化,但它的原理比你想的简单。今天咱们直接上手,用一个完整的小项目把美眉图跑通,不再死磕那些冗长的理论说明。…

2026/9/23 0:01:25 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/23 4:49:06 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/23 9:53:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/23 9:53:40 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/23 9:53:40 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/23 9:53:40 阅读更多 →