应使用cache::get()与cache::put()手动管理定时任务参数,确保可持久化、自增及条件复用;推荐带环境标识的键名、合理ttl(如分页1–6小时),避免硬编码或命令行传参,并在失败时谨慎处理页码更新。

定时任务里反复用同一个 GET 查询参数(比如分页页码、时间偏移、API 版本)时,不能靠命令行手动传参硬编码,得让参数可持久化、可自增、可条件复用——否则每次都要人工干预,根本没法进 schedule 自动跑。
Cache::get() + Cache::put() 手动管理参数值
这是最可控、最不容易出错的方式。适合需要精确控制参数生命周期、或参数变更逻辑较复杂的场景(如“上一页成功才翻下一页”)。
-
Cache::get('sync:page')读取当前页码,未命中返回null,此时应设默认值(如1) - 执行完一页逻辑后,调用
Cache::put('sync:page', $nextPage, 3600)写入下一页,TTL 设为 1 小时足够覆盖单次任务执行窗口 - 不要用
Cache::increment()直接操作页码——它不支持初始化,首次运行会失败;也不支持带 TTL 的原子自增 - 键名建议带环境和任务标识,例如
sync:employee:page:production,避免本地开发与线上缓存冲突
用 Cache::remember() 避免重复初始化
当你希望“首次访问自动设初值,后续直接读”,Cache::remember() 比 get+put 更简洁,且天然防并发竞态。
- 写法:
$page = Cache::remember('sync:page', 3600, fn() => 1); - 闭包只在缓存缺失时执行一次,确保多进程同时启动也不会重复设值
- 但注意:它不能用于“执行后更新值”,因为 remember 只读不写;需另配
Cache::put()更新 - 如果页码依赖上一次请求结果(如 API 返回了
meta.next_page),必须拆成两步:先remember读,再put写新值
别把参数塞进命令签名里
像 php artisan sync:users {page?} 这种写法,在 schedule 中完全不可用——你没法让 $schedule->command('sync:users 2') 动态生成页码。
- 命令签名里的参数是静态字符串,无法在调度时计算或读缓存
- 试图用
Artisan::call('sync:users ' . Cache::get('page'))是反模式:绕过命令生命周期,丢失输入验证、日志、异常处理等框架保障 - 真正该做的,是在
handle()方法内部统一读缓存、执行、写缓存,让命令本身无状态
缓存参数的 TTL 和失效时机很关键
参数不是越久越好。页码类参数一旦卡住,整个同步流程就停摆;而配置类参数(如 api:version)可以缓更久。
- 分页参数 TTL 建议 1–6 小时,足够容错,又不会长期滞留脏值
- 若任务失败(如 API 返回 429 或超时),不要自动递增页码——应原地重试或降级处理,否则跳过数据
- 手动触发重跑时(如
php artisan sync:users --force),应在逻辑开头Cache::forget('sync:page')归零,避免延续旧状态 - 所有参数读写必须加 try/catch,缓存驱动临时不可用时要有 fallback(如固定从第 1 页开始)
参数缓存真正的难点不在“怎么存”,而在“什么时候不该存”——比如上游 API 明确要求按顺序拉取、或下游数据库写入失败需回退页码。这些业务规则必须显式编码进缓存读写逻辑里,不能指望 TTL 自动兜底。











