ThinkPHP在Linux如何进行代码热更新
导读:在 Linux 下,ThinkPHP 实现代码热更新的主流做法是基于 Swoole 常驻内存运行,并通过文件监控或进程信号触发平滑重启。下面给出可直接落地的配置与操作。 方案一 Think-Swoole 组件实现热更新 环境与安装 要...
在 Linux 下,ThinkPHP 实现代码热更新的主流做法是基于 Swoole 常驻内存运行,并通过文件监控或进程信号触发平滑重启。下面给出可直接落地的配置与操作。
方案一 Think-Swoole 组件实现热更新
- 环境与安装
- 要求:Linux/MacOS、PHP Swoole 扩展 4.3.1+、ThinkPHP 6。
- 安装组件:
composer require topthink-swoole。
- 启动与常用命令
- 启动服务:
php think swoole(默认监听 0.0.0.0:80,如端口占用请在 config/swoole.php 调整)。 - 常用命令:
php think swoole start|stop|restart|reload。
- 启动服务:
- 开启热更新
- 开发环境:在根目录 .env 中设置 APP_DEBUG=true,热更新默认开启(基于文件监控自动 reload)。
- 生产或按需开启:在 config/swoole.php 配置 hot_update:
'hot_update' => [ 'enable' => true, // 开启文件监控自动 reload 'name' => ['*.php'], // 监控的文件后缀 'include' => [app_path()], // 监控的目录(默认应用目录) 'exclude' => [], // 排除目录 ], - 守护进程:如需后台运行,可设置
'options' => ['daemonize' => true];但一般建议仅在调试环境启用文件监控,生产环境关闭以降低开销与风险。
方案二 Workerman 场景的热更新要点
- 触发方式
- 手动热重启:
php worker.php reload(向主进程发送 SIGUSR1)。 - 文件监控自动重启:基于文件修改时间变化触发 SIGUSR1。
- 手动热重启:
- 无效果的常见原因与处理
- OPcache 等字节码缓存:开发环境请在 php.ini 或相应 ini 中关闭(如
opcache.enable=0、opcache.enable_cli=0),并重启 PHP 进程,否则文件变更可能不生效。 - 守护模式限制:部分文件监控在 daemon 下不执行,需改为前台运行或自行改造监控脚本。
- 加载时机:只有在 Worker::runAll 之后动态加载或自动加载的文件才支持热更新(如回调中加载的文件)。
- OPcache 等字节码缓存:开发环境请在 php.ini 或相应 ini 中关闭(如
方案三 不重启进程的业务热更新
- 适用场景:不更换 PHP 文件,仅更新配置、字典、模板或执行数据库迁移/脚本。
- 常见做法
- 在线下载更新包、解压覆盖、执行数据库变更脚本,然后返回成功提示;示例思路:
- 下载到 runtime/update/,使用 ZipArchive 解压覆盖到项目根目录。
- 执行内置的 SQL/迁移脚本(如 include 一个临时 php 文件后删除)。
- 注意目录权限与回滚预案,避免半更新状态。
- 在线下载更新包、解压覆盖、执行数据库变更脚本,然后返回成功提示;示例思路:
生产环境建议
- 优先采用:蓝绿/灰度发布 + 滚动重启,避免文件监控带来的性能抖动与不可预期行为。
- 如确需热更新:仅在小流量时段启用,变更前做好备份与回滚方案,并配合健康检查与进程守护(如 systemd)。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: ThinkPHP在Linux如何进行代码热更新
本文地址: https://pptw.com/jishu/773193.html
