Search by

creatcode / cronweave

定时任务调度引擎

Maintainers

Package info

github.com/creatcode/cronweave

Type:think-extend

pkg:composer/creatcode/cronweave

Transparency log

Statistics

Installs: 3

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

v1.0.1 2026-09-02 03:43 UTC

This package is auto-updated.

Last update: 2026-09-02 03:44:30 UTC


README

适用于 ThinkPHP 定时任务调度引擎。它使用 cronweavecronweave_log、Redis 队列 cronweaveruntime/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 决定自定义任务类型如何执行;内置 urlsqlshell 类型不需要额外注册。任务的通用内容放在 content

自定义类型的参数有两种存放方式,按需选择:

  • 专用字段(推荐用于核心业务字段):引擎读取任务时整行透传(SELECT *),宿主对任务表自行 ALTER TABLE 加列后,handler 直接从 $task 读取,引擎零感知。需要按字段查询(如"该设备有哪些任务")、字段是表单必填主体时用这种方式。
  • extra JSON(适合可选执行参数):不需要 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],

扩展类型的后台表单由宿主自行提供(内置插件只管理 urlsqlshell);插件保存任务时提交什么更新什么,未提交的字段(含 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: 停止

生产环境应分别守护 schedulerexecutor 两个 Workerman 角色,避免调度扫描阻塞任务执行。cronweave.lock 仅是单机文件锁;多机部署需要外部分布式锁。

Windows

Workerman 在 Windows 下不支持单进程内运行多个 worker 脚本,--worker=all 会被拒绝。包内提供了批处理脚本(自动定位项目根目录,同一窗口后台启动 scheduler 与 executor,关闭窗口即停止):

vendor\creatcode\cronweave\bin\cronweave-start.bat

也可手动分别执行 php think cronweave start -w --worker=schedulerphp think cronweave start -w --worker=executor

Redis List/BRPOP 为至多一次语义:任务被消费者弹出后进程异常退出时,不会自动确认或重投。