Cloudflare Workers 定时任务
很多业务需要定时执行,比如每天凌晨清理过期数据、每小时抓取一次价格、每周生成一份报表。Cloudflare 提供了 Cron Triggers 定时触发机制,直接在 Worker 上配置即可。
什么是 Cron Triggers
Cron Triggers 让 Worker 按设定的时间表自动运行,不需要用户请求触发。到点后平台会调用 Worker 的 scheduled 函数,代码在边缘节点执行,和普通请求一样有完整的资源环境。
配置定时计划
在 wrangler.toml 中添加触发器配置
name = "my-worker"
main = "src/index.js"
compatibility_date = "2026-01-01"
[triggers]
crons = ["0 8 * * *", "*/30 * * * *"]
crons 是一个数组,可以配置多条计划,上面的例子分别是”每天早上 8 点”和”每 30 分钟一次”。
编写 scheduled 处理函数
Worker 同时支持 fetch 和 scheduled 两个入口
export default {
// 定时任务入口
async scheduled(event, env, ctx) {
console.log("定时任务触发,计划表达式", event.cron);
await doCleanup(env);
},
// 普通请求入口
async fetch(request, env, ctx) {
return new Response("hello");
},
};
async function doCleanup(env) {
// 清理过期数据等业务逻辑
await env.DB.prepare("DELETE FROM sessions WHERE expired_at < ?")
.bind(Date.now()).run();
}
scheduled 函数接收的 event 对象有两个常用属性
| 属性 | 说明 |
|---|---|
event.cron |
触发本次执行的 cron 表达式 |
event.scheduledTime |
计划执行的时间戳 |
一个 Worker 配了多条计划时,可以用 event.cron 判断当前是哪条计划触发,分发到不同的处理逻辑。
cron 表达式语法
cron 表达式由 5 段组成,依次是
| 位置 | 含义 | 取值范围 |
|---|---|---|
| 1 | 分钟 | 0-59 |
| 2 | 小时 | 0-23 |
| 3 | 日 | 1-31 |
| 4 | 月 | 1-12 |
| 5 | 星期 | 1-7(1 是周日) |
常用写法示例
| 表达式 | 含义 |
|---|---|
* * * * * |
每分钟 |
*/5 * * * * |
每 5 分钟 |
0 * * * * |
每小时整点 |
0 9 * * 1 |
每周日 9 点(1 是周日) |
30 2 * * 1-5 |
周一至周五凌晨 2 点 30 分 |
0 0 1 * * |
每月 1 日零点 |
有三个重要注意事项
| 注意点 | 说明 |
|---|---|
| 时区固定 UTC | 北京时间比 UTC 快 8 小时,早上 8 点要写 0 0 |
| 星期从 1 开始 | 1 是周日,7 是周六,与常见 cron 工具不同 |
| 最小间隔 1 分钟 | 无法配置比每分钟更频繁的触发 |
限制
| 限制项 | 免费计划 | 付费计划 |
|---|---|---|
| 每账号数量 | 5 个 | 250 个 |
| 最小间隔 | 1 分钟 | 1 分钟 |
| 每次执行 CPU | 10ms | 30 秒 |
| 最长运行时长 | 15 分钟 | 15 分钟 |
本地测试
部署前先在本地验证定时逻辑。启动开发服务器时开启定时测试模式
wrangler dev --test-scheduled
然后手动触发一次定时任务
curl "http://localhost:8787/__scheduled?cron=*+*+*+*+*"
注意 cron 参数里的空格要用 + 号编码。触发后终端会显示 console.log 的输出,验证逻辑正确后再部署。
部署与线上验证
定时任务只有部署到线上才会真正生效
wrangler deploy
部署完成后,在仪表盘 Worker 的 触发器 页面可以看到配置的计划。用 wrangler tail 实时查看线上日志,到点后观察任务是否正常执行。
实用场景
| 场景 | 示例计划 |
|---|---|
| 清理过期数据 | 0 4 * * * 每天凌晨 4 点 |
| 定时抓取数据 | */30 * * * * 每 30 分钟 |
| 生成日报 | 0 1 * * * 每天凌晨 1 点 |
| 缓存预热 | 0 6 * * * 每天清晨 6 点 |
| 发送提醒 | 0 9 * * 1-5 工作日早 9 点 |
注意事项
定时任务不会自动重试,执行失败只能等下次触发,所以代码里要有容错。复杂任务建议结合 KV、D1 记录执行状态,任务里等待网络请求的时间不占 CPU 配额,可以放心处理多步操作。
下一篇进入开发闭环的收尾环节,调试与线上部署。