Laravel的队列和Web工作者

时间:2015-05-13 21:03:00

标签: php queue laravel-5 web-worker

我刚刚开始使用Queues,它们可以很好地用于发送消息,并向Twilio等发送电子邮件和短信。

但现在我想做一些更复杂,更耗时的事情。我希望将大约10,000行的文件上传到AmazonS3,解析它,检查重复项,然后只插入不重复的记录。

当我运行此过程时,需要6分钟才能完成。这是多久的方式。我希望在后台运行此操作,并根据队列状态使用可视化进度条偶尔更新。

此外,在运行时,我希望用户具有对站点和数据库表的完全访问权限。这个过程,将锁定我的主表。 所以我基本上想让它在后台运行,只触摸主表一次以检查重复项,然后从那里只需将文件处理/解析为10,000多行的临时表。而让另一张桌子免费。

一旦完成......它只会回写一次主表。

如何在不降低站点/主服务器速度的情况下实现这一目标?我为极其广泛的问题道歉

1 个答案:

答案 0 :(得分:1)

Laravel Queues可以做你想做的事,但在你的电子邮件中还有几点需要解决。

如何在不降低网站/主服务器速度的情况下实现这一目标?

好吧,队列在服务器上作为一个单独的进程运行,所以你可能不会对服务器产生重大影响,前提是你的后台进程没有做太多紧张的事情服务器。如果您担心对性能的影响并且您正在运行Linux服务器,则可以选择限制进程使用的资源 - 查看renice命令,该命令允许您调整进程的优先级。如果您不在Linux上,那么您的操作系统可能还有其他选项。

关于数据库,如果不知道你的表是什么样的话,那就很难回答。可以使用单个查询检查重复项,并在两个表上检查JOIN,也许可以将检查结果写入另一个表。此可能有效,但也可能需要很长时间,具体取决于表的设置方式。另一种解决方案是使用主数据库表的镜像 - 临时复制,完成工作,然后删除它。最后,对于一个真正的解决方案,设置数据库复制并解决奴隶问题。

至于运行队列工作程序,我发现使用supervisord运行我的后台工作非常有用 - 它允许我轻松地启动/停止进程,并在失败时自动重启进程。 documentation on queue listeners对此进行了一些讨论。

工人将失败 - 我发现我的工作流程经常失败。我认为它与PHP CLI设置有关,但它没有给我带来任何问题,所以我没有真正进一步调查它。但是,对于长期工作,您可能会遇到困难。减轻这种情况的一种方法是将你的工作分成多个较小的工作并将它们“菊花链”在一起:当part1完成时,它排队第二部分;当part2完成时,它排队第3部分等等。

至于进度条,这很容易。让作业更新一个值(在您的数据库中可能,或者可能在文件系统中)与当前状态,并在客户端上有一个Javascript函数定期执行AJAX请求以获得该值&更新进度条。