如何使用自定义时钟与PHP程序使用Heroku Worker作业?

时间:2016-03-05 16:57:30

标签: php heroku background-process scheduler clock

我是Heroku的新手。我正在努力实现一些简单的事情(至少我希望如此),但似乎没有直接的方法可以做到这一点。

我有几个PHP文件,我尝试作为预定作业运行(每5分钟)。这些运行一些时间可能需要超过30秒才能完成。因此,据我所知,我需要将它们设置为工人工作。

Heroku上给出的示例似乎是一个复杂的示例,我无法理解现有的PHP文件应该如何标记为worker。

另外,我想安排这个工人工作每5分钟运行一次。文档是指自定义时钟,但PHP没有示例。

有人可以指点我一个关于如何使用Worker进程并为他们安排Heroku for PHP程序的教程吗?初学者可以遵循的东西。

谢谢!

2 个答案:

答案 0 :(得分:1)

在这种情况下,时钟进程的工作是定期地调用其他代码,将其称为 scheduler 。为了争辩,可以说我们的调度程序将每分钟被调用一次。这就是laravel Scheduler以及我使用(并编写)的Heroku时钟的设置方式。

我们在这里想要实现什么?为了使时钟成为一个好时钟,它必须具有某种程度的可靠性。我们不是在谈论微秒精度或任何类似的东西。我自己的设计标准只是时钟必须每分钟调用一次调度程序。这就是我所需要的。实际上,根据我所做的测试,它大约在每分钟的前五秒钟内执行此操作(我的时钟代码位于此答案的底部-但看起来还没有!)。

您在heroku上的时钟进程将有一个诸如clock: php artisan clock之类的procfile条目。 laravel就是这种情况。那只是运行包含时钟的php命令。

时钟做什么?它所做的只是定期地每分钟调用一次调度程序。

调度程序做什么?它提供了一种指定作业运行时间的方式(每天,每周,星期二下午2点等)。当调度程序被调用时,它所要做的就是检查您要求它执行的所有调度的列表,并询问“在此特定时刻需要做任何事情吗?”。如果找到任何东西,它将运行它(您的时钟/调度程序dyno应该分派给工作人员,而不是直接直接运行该工作,以使其保持可靠性),否则,它表示“目前没有计划运行任何任务”,然后退出。然后时钟在第二分钟再次调用它,依此类推。

我意识到OP指定的php并没有提及laravel,如果这个答案最终有点特定于laravel,则表示歉意,但这就是我所知道的。对于laravel,这是scheduler命令。这样就为您提供了进行调度所需的所有代码,您只需按时调用即可。输入时钟。非heroku设置方式是添加一个 cron条目,每分钟调用一次。在Heroku上,我们仅使用具有完全相同目的的时钟过程-每分钟调用一次该命令。

因此,您的任务(应该选择接受)是编写一个小的php程序,它将作为守护程序运行(Procfile中指定的所有heroku dynos都作为守护程序运行,即连续运行)(一个procfile条目)这不是守护程序,对此没有多大意义),它的工作是坐在那里运行,可能会睡一会儿,然后醒来,并自行安排它可以调用您的调度程序,例如$this->call('schedule:run'),每分钟一次。这就是所有时钟要做的事情,其余的取决于调度程序,无论您碰巧遇到了什么。

要写出实际的时钟,这是一个有趣的小任务,您一定会从自己提出问题并在研究我的答案之前考虑一下问题而受益!

这是我的时钟守护程序使用的内容(已删除特定于环境的日志记录)。包含此代码作为其主体的命令在Procfile中称为“时钟”。

while(true) {
  if (now()->second <= 10)  // "runnable window"
  {
      $this->call('schedule:run');
      sleep(4);             // "min. duration"
  } 
  sleep(7);                 // "polling delay"
}

您应该考虑一下并自己进行测试,方法是仅记录日志而不是调用时间表作为开始,并在日志中查看它的运行情况。只要时钟/调度程序过程不超过30秒,此方法就起作用。您可以通过将任务从调度程序分配给您的工作人员,而不是在时钟中进行长时间运行的工作来实现(如heroku docs所建议的那样),否则它将在下一分钟丢失,因为时钟仍将限制调度程序的运行从前一分钟开始。

请注意,测功机每天都会重启。因此,我让此运行程序运行并检查了它是否可靠地每分钟调用一次,即使在整个时钟dyno循环中也是如此。您可以看到该代码最多允许大约10秒钟的时钟过程中断,以涵盖dyno重新启动。我不确定heroku上的最大dyno中断是多少,这似乎不到10秒。这些间隔对我来说效果很好,并且我有信心在我的用例中(绝对不是关键),它具有很好的可靠性。可能会设置比我实际上更全面的测试。如果有人这样做,我很想听听结果。设置时钟运行并使其在调用时记录日志,并在推送代码时观察其行为,以及每天重启一次,以使您对时钟的运行方式充满信心。如果有时间,我可能会写得比这更好!同时,希望这会有所帮助。这确实取决于heroku循环其测功的确切方式,因此测试的重要性,至少我是这样认为的。也许有一个更好的算法,如果有人有一个,我就是耳朵。

最后,要回答操作问题,您可以设置一个“时钟”,该时钟每 5 分钟呼叫一次,但我怀疑您最好设置一个每分钟呼叫一次的时钟并从中调用一个调度程序,该调度程序仅询问“当前时间(以秒为单位,模为5秒等于零)”,然后将其分派给工作人员。这意味着您可以测试您的时钟,我们可以在此处开发和共享通用解决方案的结果。

答案 1 :(得分:1)

对于时钟过程,我可以通过以下三个步骤轻松解决:

  • 在Heroku帐户中设置信用卡信息;
  • 已安装Heroku Scheduler插件(可以使用命令heroku addons:create scheduler:standard --app <yourAppName>);
  • 设置脚本以按计划的作业运行:

enter image description here

更多信息herehere