creatcode / cronweave
定时任务调度引擎
Requires
- php: >=7.4
- ext-curl: *
- ext-json: *
- creatcode/crontab-expression: >=1.5.1
Requires (Dev)
- workerman/redis-queue: ^1.0
- workerman/workerman: ^4.0
Suggests
- ext-pcntl: Linux下多进程执行与超时控制需要
- workerman/redis-queue: 使用Workerman驱动时需要
- workerman/workerman: 使用Workerman驱动时需要
Provides
None
Conflicts
None
Replaces
None
This package is auto-updated.
Last update: 2026-09-02 03:44:30 UTC
README
适用于 ThinkPHP 定时任务调度引擎。它使用 cronweave、cronweave_log、Redis 队列 cronweave 及 runtime/cronweave/,
支持常驻进程/Workerman双驱动,适配ThinkPHP各版本
安装
composer require creatcode/cronweave
运行 php think cronweave install 按宿主前缀建调度表(IF NOT EXISTS,已存在则跳过);
发布后的配置文件为 cronweave.php。主要配置如下:
return [ 'table' => 'cronweave', 'log_table' => 'cronweave_log', // error: 仅失败任务;all: 成功和失败任务均写执行日志。 'log_mode' => 'error', 'runtime_directory' => '', 'redis' => [ 'host' => '127.0.0.1', 'port' => 6379, 'password' => '', 'db' => 0, // 留空时队列键就是 cronweave。 'prefix' => '', ], // type => TaskHandlerInterface 实现类 'handlers' => [], ];
log_mode 默认为 error,避免高频成功任务持续写入日志表;需要完整执行审计时设置为 all。
handlers 决定自定义任务类型如何执行;内置 url、sql、shell 类型不需要额外注册。任务的通用内容放在 content。
自定义类型的参数有两种存放方式,按需选择:
- 专用字段(推荐用于核心业务字段):引擎读取任务时整行透传(SELECT *),宿主对任务表自行
ALTER TABLE加列后,handler 直接从$task读取,引擎零感知。需要按字段查询(如"该设备有哪些任务")、字段是表单必填主体时用这种方式。 extraJSON(适合可选执行参数):不需要 SQL 查询、仅 handler 自己消费的松散参数(如重试次数、超时秒数)以 JSON 放在extra列,加新参数不用改表。
use Creatcode\Cronweave\Contract\TaskHandlerInterface; use Creatcode\Cronweave\TaskResult; class DeviceCommandHandler implements TaskHandlerInterface { public function execute(array $task): TaskResult { // 专用字段: ALTER TABLE加列后直接可用 $deviceIds = $task['device_ids'] ?? ''; // 可选参数: extra JSON $extra = json_decode((string)($task['extra'] ?? ''), true) ?: []; // 按宿主业务发送设备指令。 return TaskResult::success('已发送'); } } // cronweave.php 'handlers' => ['device_command' => DeviceCommandHandler::class],
扩展类型的后台表单由宿主自行提供(内置插件只管理 url、sql、shell);插件保存任务时提交什么更新什么,未提交的字段(含 extra)保持原值不受影响。
运行
本地常驻驱动开箱即用;Workerman 驱动需要额外安装(composer.json 中已声明为 suggest):
composer require workerman/workerman workerman/redis-queue
php think cronweave # 本地常驻调度器 php think cronweave runone 123 # 手动同步执行一次任务 php think cronweave start -w --worker=scheduler -d # Workerman: 调度进程 php think cronweave start -w --worker=executor -d # Workerman: 执行进程 php think cronweave status -w # Workerman: 进程状态 php think cronweave stop -w # Workerman: 停止
生产环境应分别守护 scheduler 和 executor 两个 Workerman 角色,避免调度扫描阻塞任务执行。cronweave.lock 仅是单机文件锁;多机部署需要外部分布式锁。
Windows
Workerman 在 Windows 下不支持单进程内运行多个 worker 脚本,--worker=all 会被拒绝。包内提供了批处理脚本(自动定位项目根目录,同一窗口后台启动 scheduler 与 executor,关闭窗口即停止):
vendor\creatcode\cronweave\bin\cronweave-start.bat
也可手动分别执行 php think cronweave start -w --worker=scheduler 与 php think cronweave start -w --worker=executor。
Redis List/BRPOP 为至多一次语义:任务被消费者弹出后进程异常退出时,不会自动确认或重投。