首页主机资讯ThinkPHP在Linux如何进行代码热更新

ThinkPHP在Linux如何进行代码热更新

时间2025-12-16 20:48:03发布访客分类主机资讯浏览812
导读:在 Linux 下,ThinkPHP 实现代码热更新的主流做法是基于 Swoole 常驻内存运行,并通过文件监控或进程信号触发平滑重启。下面给出可直接落地的配置与操作。 方案一 Think-Swoole 组件实现热更新 环境与安装 要...

在 Linux 下,ThinkPHP 实现代码热更新的主流做法是基于 Swoole 常驻内存运行,并通过文件监控或进程信号触发平滑重启。下面给出可直接落地的配置与操作。


方案一 Think-Swoole 组件实现热更新

  • 环境与安装
    • 要求:Linux/MacOSPHP 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=0opcache.enable_cli=0),并重启 PHP 进程,否则文件变更可能不生效。
    • 守护模式限制:部分文件监控在 daemon 下不执行,需改为前台运行或自行改造监控脚本。
    • 加载时机:只有在 Worker::runAll 之后动态加载或自动加载的文件才支持热更新(如回调中加载的文件)。

方案三 不重启进程的业务热更新

  • 适用场景:不更换 PHP 文件,仅更新配置、字典、模板或执行数据库迁移/脚本。
  • 常见做法
    • 在线下载更新包、解压覆盖、执行数据库变更脚本,然后返回成功提示;示例思路:
      • 下载到 runtime/update/,使用 ZipArchive 解压覆盖到项目根目录。
      • 执行内置的 SQL/迁移脚本(如 include 一个临时 php 文件后删除)。
      • 注意目录权限与回滚预案,避免半更新状态。

生产环境建议

  • 优先采用:蓝绿/灰度发布 + 滚动重启,避免文件监控带来的性能抖动与不可预期行为。
  • 如确需热更新:仅在小流量时段启用,变更前做好备份与回滚方案,并配合健康检查进程守护(如 systemd)。

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: ThinkPHP在Linux如何进行代码热更新
本文地址: https://pptw.com/jishu/773193.html
Linux中ThinkPHP如何实现容器化部署 Linux下ThinkPHP如何实现自动化运维

游客 回复需填写必要信息