FrankenPHP 不支持内置定时任务,其 worker 模式仅用于 HTTP 请求常驻处理;定时任务需由系统 cron 或独立进程(如 php artisan schedule:run)管理,与 FrankenPHP 进程严格分离。

不能。FrankenPHP 的定时任务和 worker 服务不能放在同一个进程内统一管理,原因在于二者的设计定位、生命周期和运行模型根本不同。
定时任务不是 FrankenPHP 原生能力
FrankenPHP 本身不提供内置的定时任务调度器(比如类似 Laravel Scheduler 或 crond 的功能)。它专注的是 HTTP 请求处理:接收请求 → 路由 → 执行 PHP 脚本(普通模式或常驻 worker 模式)。它的“worker”指的是处理 HTTP 请求的常驻 PHP 实例,不是通用后台任务进程。
你看到的“定时任务”通常来自:
- 应用层代码(如 Laravel 的
php artisan schedule:run) - 外部独立进程(如系统 cron、Supervisor 管理的
queue:work) - 第三方库(如 Workerman 的
Timer::add(),但需自己启动 Worker 进程)
⚠️ 注意:Workerman 的
Timer必须运行在自己的Worker::runAll()进程中,和 FrankenPHP 的 PHP 运行时完全隔离。强行把Timer::add()写进 FrankenPHP 的入口脚本(如frankenphp-worker.php)不会生效——因为 FrankenPHP 不会持续运行你的回调函数,它只在 HTTP 请求到来时触发一次执行。立即学习“PHP免费学习笔记(深入)”;
Worker 模式只服务于 HTTP 请求
FrankenPHP 的 worker 模式是为复用框架初始化状态、加速请求响应而设计的。每个 worker 实例:
- 绑定一个 PHP 脚本(如
frankenphp-worker.php) - 在进程内常驻加载框架、容器、配置
- 仅响应通过 HTTP 触发的请求(由 Caddy 转发过来)
- 不监听队列、不轮询数据库、不执行计划任务
它没有事件循环、没有后台 tick 机制,也没有暴露 onWorkerStart 或 onWorkerStop 这类钩子(那是 Workerman/Swoole 的 API)。
正确做法:分离职责,进程解耦
- ✅ HTTP 服务:交给 FrankenPHP(开启 worker 模式提升接口性能)
- ✅ 定时任务:用系统 cron 或专用守护进程(如 Supervisor +
php artisan schedule:run) - ✅ 队列消费:单独运行
php artisan queue:work(必须独立进程,Octane/FrankenPHP 不接管) - ✅ 长连接/推送服务:用 Mercure(FrankenPHP 原生支持)或另起 Swoole/Workerman 进程
例如,Laravel 项目典型部署结构:
frankenphp ← 处理所有 /api/* /web/* HTTP 请求(常驻) php artisan schedule:run ← 每分钟 cron 调用,触发定时任务 php artisan queue:work ← Supervisor 管理的独立常驻进程
这种分离不是限制,而是工程上的合理分层:让每个进程只做一件事,并做到极致。



















