TGViewer
开发者工具箱|编程·开发工具·资源 开发者工具箱|编程·开发工具·资源 @devtoolboxhub · 559 subscribers
Post #1197 2
Symfony Scheduler:将定时任务纳入代码版本

SSH 进服务器看 crontab 时,发现一堆被注释掉的行、指向已删除命令的入口、无人知晓的 3am 任务——这些都在单台机器上,不在 Git,不在部署流程,随自动伸缩消失。Symfony Scheduler 组件让定时任务变为版本化的 PHP 代码,随应用发布、接受代码审查、可单元测试。自 Symfony 6.4 稳定以来持续演进。

核心是一个实现 ScheduleProviderInterface 的类,用 #[AsSchedule] 标记。every() 接受人类可读间隔(如 '1 hour'),cron() 使用标准 cron 表达式。消息是普通 DTO,无基类无接口。调度本身是 Messenger 传输层——到期的消息经同一总线、中间件、重试策略和失败传输处理。运行命令为 php bin/console messenger:consume scheduler_main,生产环境用 Supervisor 或 systemd 管理,无需任何 crontab 行。

注意单进程锁陷阱:如果运行多个消费者,每个都会独立触发调度。安装 symfony/lock 组件并用共享存储(Redis、数据库)加锁,只有锁持有者生成消息。可选 ->stateful() 配合缓存池记录上次运行,让恢复的 worker 能补发错过的触发。

可单元测试调度逻辑:通过 getSchedule()->getRecurringMessages() 获取消息,对 getTrigger()->getNextRunDate() 断言,在 CI 中捕获 cron 变更,而非在工单中调查。调度随部署和回滚同步,锁和状态保持在框架边缘,业务逻辑只关心消息 DTO。


#开发者 #工具 #Symfony #PHP #Cron #Messenger #Scheduler #单元测试
@DevToolboxHub
More from @devtoolboxhub
  1. Oct 2, 2026功能开关正在变成没人清理的技术债 功能开关(Feature Flag)是现代软件交付里最有效的工具之一:支持灰度发布、A/B 实验、未发布功能门控,以及生产环境的即时熔断开关。但这…
  2. Oct 2, 2026containerd 检查点恢复路径默认关闭 Kubernetes 里策略变成进程状态只有一处,就是创建。检查点恢复是通往运行进程的第二条路,而这条路上没有任何环节决定:当保存的状…
  3. Oct 1, 2026给 AI 代理建一份「自欺清单」 维也纳邮政与邮件服务商 Postservice.at 创始人 Stephan Holzbach 不是开发者,但今年公司大部分工作跑在 Claude…
  4. Oct 1, 2026代码评审评论为何比本意更刺耳 一条评审评论大约四十秒写完,通常夹在两件事之间,写的人清楚自己的语气。读的人刚在这份代码上花了三天,正想收尾,而且听不到你的声音,于是自己补上一种语气…
  5. Oct 1, 2026用 Hindsight 给客服 Agent 加上持久记忆 大多数客服 Agent 只擅长回答眼前这条消息。真正难的是同一个客户一周后再来,Agent 完全不知道之前发生过什么。作者…
  6. Sep 30, 2026AMSI 绕过技术 2026 开发者指南 AMSI(Antivirus Malware Scan Interface)是 Windows 的恶意脚本扫描接口,覆盖 PowerShe…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →