laravel 本身不监听 unix 信号,kill -usr2 是 php-fpm 或 swoole 的行为;平滑重启需依赖运行环境(如 php-fpm + nginx 或 swoole reload),laravel 仅需确保缓存已生成;opcache 清理必须 reload php-fpm 而非仅 opcache_reset()。

重启 Laravel 项目时为什么不能直接 kill -USR2?
因为 Laravel 本身不监听 Unix 信号,kill -USR2 是 PHP-FPM 或 Swoole 的行为,不是 Laravel 的。你看到的“平滑重启”其实是底层 Web 服务器或运行时的特性,Laravel 应用层没有内置这个能力。
常见错误现象:php artisan serve 进程被 kill 后请求直接断连;用 supervisorctl restart 硬重启导致队列中断、会话丢失、未完成事务回滚失败。
- 真正要平滑,得靠运行环境配合:PHP-FPM + Nginx(fastcgi)或 Swoole/Swoft 的 reload 机制
- Laravel 自身只负责“准备好被 reload”:确保
config:cache、route:cache已执行,避免每次请求都重读 PHP 文件 - 如果用
php-fpm,改完代码后执行sudo systemctl reload php-fpm才算平滑——旧 worker 处理完手头请求才退出,新 worker 启动后接新请求
OPcache 清理为什么不能只清 opcache_reset()?
因为 opcache_reset() 只清当前 PHP 进程的缓存,而 PHP-FPM 是多进程模型,每个 worker 都有独立 OPcache。调一次函数,只影响一个 worker,其他 worker 还在跑旧字节码。
使用场景:部署新版本后,页面没更新、报错仍指向旧文件行号、dd() 输出还是老逻辑。
- 正确做法是重启 PHP-FPM:
sudo systemctl reload php-fpm(reload 会逐个替换 worker,比 restart 更温和) - 开发环境可临时关 OPcache:在
php.ini中设opcache.enable=0,但别在生产用 - 若用 Docker,注意 OPcache 在容器内生效,
docker exec -it app php -r "opcache_reset();"依然只清当前 exec 进程,无效
如何让 Laravel 部署后自动清理 OPcache 并触发 FPM reload?
不能依赖 Laravel 自己做,必须在部署脚本里控制。关键点是权限和时机:PHP-FPM 主进程由 root 管理,普通 deploy 用户无法直接 reload,得配好 sudo 权限或用 systemd user unit。
实操建议(以 Ubuntu + systemd 为例):
- 给 deploy 用户加 sudo 免密权限:
deploy ALL=(root) NOPASSWD: /bin/systemctl reload php*-fpm - 部署脚本末尾加:
sudo systemctl reload php7.4-fpm(按实际版本调整) - 不要在
php artisan up后立刻 reload,先确保config:clear、view:clear、cache:clear完成,否则新 worker 可能加载到旧配置 - 如果用 Envoyer 或 Laravel Envoy,
@task里写命令前加sudo,并确认远程用户有对应权限
为什么有些团队用 touch storage/framework/down 却发现页面没变?
因为 down 文件只对 HTTP 请求起作用(通过 CheckForMaintenanceMode 中间件),不影响队列、定时任务、Artisan 命令、甚至某些异步 HTTP 客户端请求。更隐蔽的问题是:OPcache 缓存了中间件类本身,哪怕你删了 down 文件,Laravel 还在用旧版中间件判断逻辑。
- 上线前务必确认:
storage/framework/down已删除,且 PHP-FPM 已 reload(否则中间件字节码还是旧的) -
php artisan down --render="errors::503"生成的响应模板也受 view cache 影响,记得view:clear - 如果用了 CDN,还要单独刷新 HTML 缓存,否则用户看到的仍是旧的 503 页面
最麻烦的不是操作步骤多,而是每个环节都可能卡在缓存层级里:OPcache → config cache → route cache → view cache → CDN。漏掉任意一层,都会让你盯着屏幕怀疑人生。











