use*_*563 8 php clock scheduler heroku background-process
我是Heroku的新手.我正在努力实现一些简单的事情(至少我希望如此),但似乎没有直接的方法可以做到这一点.
我有几个PHP文件,我试图作为预定的工作(每5分钟)运行.这些运行一些时间可能需要超过30秒才能完成.因此,据我所知,我需要将它们设置为工人工作.
Heroku上给出的示例似乎是一个复杂的示例,我无法理解现有的PHP文件应该如何标记为worker.
另外,我想安排这个工人工作每5分钟运行一次.文档是指自定义时钟,但PHP没有示例.
有人可以指点我一个关于如何使用Worker进程并为他们安排Heroku for PHP程序的教程吗?初学者可以遵循的东西.
谢谢!
在这种情况下,时钟进程的工作是定期、定期地调用其他一些代码,我们将其称为调度程序。为了便于讨论,我们假设我们的调度程序预计每分钟都会被调用。这就是 Laravel 调度程序以及我使用(和编写)的 Heroku 时钟的设置方式。
我们想在这里实现什么目标?对于一个好的时钟来说,它必须具有一定的可靠性。我们不是在谈论微秒精度或任何类似的东西。我自己的设计标准很简单,就是时钟必须每分钟调用调度程序。这就是我所需要的。实际上,根据我所做的测试,它会在每分钟的前五秒内执行此操作(我的时钟代码位于此答案的底部 - 但先别看!)。
Heroku 上的时钟进程将有一个 procfile 条目,例如clock: php artisan clock. 这是 Laravel 的情况。这只是运行包含时钟的 php 命令。
时钟有什么作用?它所做的就是定期调用调度程序,每分钟一次。
调度程序是做什么的?它提供了一种指定作业运行时间的方法(每天、每周、周二下午 2 点等)。当调度程序被调用时,它所要做的就是检查您要求它执行的所有调度列表,并询问“在这一特定分钟内我需要做些什么吗?”。如果它发现任何东西,它就会运行它(你的时钟/调度程序dyno应该分派给工作人员而不是直接运行作业本身,以帮助它保持可靠),否则,它会说“此时没有计划运行任务”,然后退出。然后时钟在下一分钟再次报时,依此类推。
我意识到OP指定了php并且没有提到laravel,如果这个答案最终有点特定于laravel,我深表歉意,但这就是我所知道的。这是Laravel 情况下的调度程序命令。它为您提供了进行调度所需的所有代码,您只需仔细调用它即可。输入时钟。设置该功能的非 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"
}
Run Code Online (Sandbox Code Playgroud)
您应该考虑这一点并亲自测试它,只需记录而不是调用计划来开始,并在日志中查看它的运行情况。只要时钟/调度程序进程不超过 30 秒,此操作就有效。您可以通过将任务从它分派给您的工作人员来实现这一点,而不是在时钟中执行长时间运行的作业(正如heroku文档建议的那样),否则它会错过下一分钟,因为时钟仍然会被调度程序占用从前一分钟开始。
请注意,dynos 每天都会重新启动。所以我让它运行并检查它每分钟是否可靠地调用,即使在时钟测功机的循环中也是如此。您可以看到,代码允许时钟进程最多中断 10 秒,以覆盖 dyno 重新启动。我不确定 Heroku 上的最大 dyno 中断是多少,它似乎远少于 10 秒。这些间隔对我来说效果很好,我相信在我的用例中(没有什么绝对关键的),这具有很好的可靠性。可以设置比我实际所做的更彻底的测试。如果有人这样做,我很想听听结果。设置时钟运行并在调用时记录它,并在推送代码时和每日重新启动时观察其行为,让您对它的行为有一定的信心。如果有时间的话我可能会写得比这更好!同时,希望这会有所帮助。这确实取决于 Heroku 循环其测功机的确切方式,因此测试的重要性,至少我是这么认为的。可能有更好的算法,如果有人有的话,我洗耳恭听。
最后,为了回答OP,您可以设置一个每五分钟调用一次的“时钟”,但我怀疑您最好设置一个每分钟调用一次的时钟并从中调用一个调度程序,该调度程序只是询问“当前时间(以秒为单位)模五秒等于零',然后将作业分派给工作人员(如果是)。这意味着您可以测试您的时钟,我们可以在此处开发并分享通用解决方案的结果。
| 归档时间: |
|
| 查看次数: |
762 次 |
| 最近记录: |