我和我的团队正在使用具有受限Linux容器(没有root用户和特权用户)的共享托管服务,我们需要开发一项涉及长时间运行任务(> 600ms)的新功能。
我们考虑了两种可能的解决方案:
分解任务,并通过前端向服务器发出一个单独的http请求。
使用bash screen运行带有无限循环的bash脚本,该循环调用php artisan schedule:run
(模仿cronjob)
我对第一个解决方案感到不舒服,我认为将服务器逻辑转移到浏览器是错误的。
第二个解决方案只是一个假设(未经测试),我们不确定bash screen是否会在任何时间随机停止。
实现我们的目标的最不稳定的方法是什么?谢谢
答案 0 :(得分:1)
假定您已经进行了探讨,因为您提到CRON并不是一个选择,但是即使是没有特权的用户也可以设置CRON,这是与Laravel调度程序结合使用的最简单的解决方案。
如果确实没有使用调度程序的实际CRON,那么我确实认为通过浏览器调用HTTP端点是您的最佳选择。只是不要认为您可以 从浏览器调用的端点只能 从浏览器调用;)
以https://www.easycron.com/为例(无隶属关系,但第一个Google结果)。您可以在此处设置CRON作业,以调用URL以CRON间隔触发这些任务。在我公司内部称为“可怜的CRON”:)
我同意运行“屏幕”会话是最不可靠的,因为在服务器重新启动时,这些会话不会再次启动,如果“无限循环”崩溃,它将不会自动重新启动。
如果您沿该路线(或任何CRON路线)行驶,则可以使用https://healthchecks.io/(同样没有关联,Google)添加一些监控。这样,您可以定义CRON时间表,并为您提供一个在CRON完成后要调用的URL,如果您的CRON没有根据CRON时间表调用该URL,则会收到通知。可以当保险了。