资讯详情

使用 Deployer 零停机部署 CodeIgniter 4:recipe/codeigniter4 完整实战指南

📅 2026/9/23 14:17:15 | 华诺云谱 👁 阅读
使用 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),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。