1

这更多的是一个架构问题。如何在Laravel中实现对长时间运行的导入的跟踪

我正要编写一堆Import实现。他们都希望有一些参数(即CSV文件),然后在一段时间内安静地继续。在我之前的项目中,我曾使用“shell_exec()”命令在后台发送这些导入,并在浏览器中监视日志文件以报告状态。我现在最大的希望是,拉拉维尔接手这里精简所有这些体力劳动。

现在,我的问题是关于背后的建议类架构。


我的一堆进口需求是:

  • 每个导入需要作为后台进程运行在浏览器中(和日志文件)
  • 开始进口
  • 监测进展情况控制台和通过HTTP

现在我打算使用“Job”在L5.1中实现基本导入。我正在努力的是在浏览器中实现某种“进度条”和监视(最近的)“日志消息”。我不需要通过套接字进行真正的“实时”视图,但应该可以定期更新正在运行的导入的进度视图。

  • 有没有人提示,如何实现这个进度的东西?

我迄今为止的做法: 阅读CSV文件,把每行一个队列元素和监控队列。日志消息可能会触发填充最近日志消息堆栈的事件。 (我可能会遇到竞争条件,因为有些行可能依赖于其他行的上一个处理)

回答

0

我会做一个ActiveBackgroundTask模式是这样的:

  • handler_class_name
  • 状态
  • 进步
  • latest_log_messages
  • 结果

,并创建您的系统的cron任务定期检查此表并启动任务,在国家created出现在该表中。每个任务在表中传递其id以定期更新resultlatest_log_messages字段。

可以扩大这个想法,例如通过,那么不仅是最新的消息可以提取每一个任务规范日志文件的位置,但也充满了任务日志可以下载。

在这种情况下,每个任务的状态可以很容易地从系统中的每个脚本检查。

将会有一个检测死的任务的问题,由于PHP错误或异常而中止任务。如果你需要这个,你可以保持php进程PIDs,并且cron脚本可以检查具有running状态的任务是否仍然真正运行。

这是否适合您的需求?

+0

是的,应该这样做。有了我的问题,我也很喜欢Laravel带来的那些东西,或者在这里推荐什么样的设计模式。 – patriziotomato

+0

@ redless81我不确定你应该这样看待事情;)总是选择最简单的解决方案。模式是为了使复杂的事情更简单。我不喜欢5.1中的Laravel Jobs。它们对我来说似乎是假的。 –

+0

我同意并且不同意;)我需要导入大约50 MB的CSV数据以将其分布到多个表格中。导入过程可能需要几个小时。我认为我需要考虑诸如可伸缩性等方面。另外,我也希望充分利用框架提供的架构,因为它为其他开发人员带来了某种标准,使其更易于测试。不过,我同意你应该防止使用模式,如果你不需要它们。 – patriziotomato