Ubuntu 上 ThinkPHP 代码热更新实践
一 运行模式与热更新原理
- 在 PHP-FPM 模式下,代码由 Nginx + PHP-FPM 解释执行,文件保存即生效,通常不需要额外配置即可“热更新”。若修改了配置或依赖,重启 PHP-FPM 即可:
sudo systemctl restart php-fpm。
- 在 Swoole/Workerman 常驻内存 模式下,代码修改不会立即生效,需要触发进程重载。使用 Think-Swoole 时,框架提供基于文件监控的自动重载能力,便于开发调试。
二 Swoole 常驻模式的热更新步骤(ThinkPHP 6)
- 安装组件与启动服务
- 安装:composer require topthink-swoole
- 启动:php think swoole(默认监听 0.0.0.0:80,如端口冲突可在 config/swoole.php 调整)
- 开启热更新
- 方式一:在 .env 中设置 APP_DEBUG=true,热更新默认启用(开发环境推荐)
- 方式二:在 config/swoole.php 显式开启:
- 配置示例:
- ‘hot_update’ => [ ‘enable’ => true, ‘name’ => ‘*.php’, ‘include’ => [app_path()], ‘exclude’ => [] ]
- 使用提示
- 热更新基于文件监控,开发环境建议开启;部署到生产环境应关闭文件监控,采用灰度/滚动发布或手动 reload,以避免性能损耗与不可预期的文件变更触发重载。
三 FPM 模式下的文件变更感知与自动重启
- 使用 inotifywait 监听代码目录,变更时触发 PHP-FPM 平滑重启(发送 USR2 信号)
- 安装工具:
sudo apt-get install inotify-tools
- 示例脚本(保存为 watcher.sh):
- #!/usr/bin/env bash
- PHP_FILES=“/var/www/your-tp-app/**/*.php”
- PHPFPM_PID=“/run/php/php8.1-fpm.pid” # 路径按实际环境调整
- inotifywait -m -e modify,create,delete --format ‘%w%f’ “$PHP_FILES” | while read FILE; do
echo “File changed: $FILE, reloading PHP-FPM…”
kill -USR2 “$(cat “$PHPFPM_PID”)”
done
- 赋权并后台运行:
chmod +x watcher.sh && nohup ./watcher.sh &
- 说明:USR2 会触发 PHP-FPM 重新加载配置与代码,对正在处理的请求完成后再退出旧进程,适合开发环境使用。
四 使用进程管理器的开发便捷方案
- 使用 Supervisor 管理 ThinkPHP/Swoole 进程,代码变更后通过进程重启实现“热更新”的体验
- 安装:sudo apt-get update && sudo apt-get install supervisor
- 配置示例(/etc/supervisor/conf.dphp.conf):
- [program:thinkphp]
- command=php /path/to/your/tp-project start
- autostart=true
- autorestart=true
- user=www-data
- redirect_stderr=true
- stdout_logfile=/path/to/your/tp-project/runtime/log/supervisor.log
- 使配置生效并启动:
sudo supervisorctl reread && sudo supervisorctl update
sudo supervisorctl start thinkphp:*
- 提示:Supervisor 侧重进程守护与自动重启,并非文件级热更新;与 inotify 配合可在开发时获得更快的“变更即生效”体验。
五 生产环境建议
- 不建议长期开启文件监控的热更新;采用 Nginx + PHP-FPM 的标准部署,代码发布使用 蓝绿部署/滚动更新 或 优雅重启(如 PHP-FPM 的 USR2)以保证稳定性与可回滚性。