据我所知,Gearman不支持预定的工作或延迟工作。我想也许预定的作业可能先在at
排队,然后在at
时间段到期后添加到Gearman队列。
at
任务是持久的,因为它们作为文件写入服务器假脱机目录中的目录。因此,唯一的瓶颈可能是将任务添加到Gearman队列的简单脚本,因为at
无法跨服务器分布。将它传递给Gearman处理实际工作意味着我可以获得适当的工作记录等。
这是解决这个问题的最好方法吗?你还有其他想法吗?
我选择Gearman而不是其他队列解决方案的原因是它有一个PHP扩展。
我写的代码用于维护需要发送的电子邮件队列。因此,我可以指定我想在星期五的9.50发送电子邮件到example@example.org,例如。
答案 0 :(得分:2)
我决定按照我原先提出的at
路线。为此,我为at
二进制文件编写了一个PHP包装器,并在Ubuntu上进行了测试。如果您有兴趣,可以在github上找到:http://github.com/treffynnon/PHP-at-Job-Queue-Wrapper
答案 1 :(得分:1)
一个相当hacky的解决方案,只能在每小时或每日解决方案中运行良好,可以使作业(功能)名称包含您希望它发送的日期。然后让工人每小时或每天从cron开始注册这些工作。
例如,如果您想在2012年3月12日星期一上午9点发送电子邮件,请将作业添加到队列中,其名称为 email_2012-03-12_09:00 。然后每小时运行一个cron作业,该作业运行一个工作人员,注册任何与电子邮件_ +当前日期和小时匹配的作业。
正如我所说的那样,可能是可行的,而是hacky!
更新1:我最近看到gearmand database persistence的文档现在提到名为 when_to_run 的字段,这是 INT ,并且可能持有unix纪元时间戳。该字段似乎尚未在代码中引用。
答案 2 :(得分:0)
如果你正在使用Zend ...
SlmQueue是一个作业队列抽象层。它允许您在Zend Framework 2应用程序中轻松使用作业队列系统。因此,它不会强制您专门使用一种类型的作业队列。您可以独立于底层系统编写代码和作业。这样可以实现系统的高度灵活性和分离。