在后台运行异步作业(laravel)

时间:2015-10-06 14:18:00

标签: php multithreading laravel pthreads beanstalkd

我知道Laravel的队列驱动程序,例如redis和beanstalkd,我读到你可以增加beanstalkd等工作人员的数量。但是我不确定这些解决方案是否适合我的方案。这就是我需要的东西;

我通过套接字连接收听XML提要,数据不断快速传播。永远。我在一秒钟内得到了数十个XML文档。

我逐行读取此套接字中的数据,一旦到达XML结束标记,我就将缓冲区发送到另一个要解析的进程。我曾经只是在base64中对xml进行编码,并为每个xml运行一个单独的php进程。 shell_exec('php parse.php' . $base64XML);

这使我能够非常快速地解析这个永无止境的xml数据。手动线程的排序。现在我想在Laravel中使用相同的功能,但我想知道是否有更好的方法来实现它。我相信Artisan :: call(' command')并没有把它推到后台。我当然可以在Laravel中做一个shell_exec,但是我想知道我是否可以从Beanstalkd或类似的解决方案中受益。

所以真正的问题是:如何设置beanstalkd或redis驱动程序的队列工作者数量?就像我想要同时运行20个线程一样。如果可能的话。

一个稍微不那么重要的问题是:多少线程太多了?如果我有一个非常高端的专用服务器可以很好地处理负载,那么使用这些工具创建500个线程/工作者会导致代码级别出现任何问题吗?

3 个答案:

答案 0 :(得分:7)

好的laravel队列就是为此做的。

基本上,你必须创建一个Job Class。您想要在xml文档上执行的所有繁重工作都需要在此处。 然后,您从套接字中取出xml,并在收到一个文档后立即you push it on your Queue.

稍后,队列工作人员将从队列中提取它,并完成繁重的工作。

这样做的好处是,如果您排队文档的速度比处理它们的速度快,那么队列将负责处理高负载时刻并将任务排队等待。

我也不建议你在没有队列的情况下这样做(像你一样用叉子)。实际上,如果文档太多,您将创建太多的子线程并使服务器过载。正确地记录这些线程是有风险的,当具有固定数量的工作人员的简单队列解决所有这些问题时,这是不值得的。)

答案 1 :(得分:0)

经过一番研究后,我找到了how to set the number of worker processes。我错过了文档中的那一部分。傻我。我仍然想知道这个监督工具是否可以处理像我这样的情况下的数百名工人。希望有人可以分享他们的经验,但如果没有,我会在本周进行性能测试后更新这个答案。

答案 2 :(得分:0)

我从经验告诉你,shell_exec()不是在PHP中运行异步任务的理想方式。 在开发过程中似乎没问题,但是如果你有一个小的vps(1-2 GB ram)你可能会使你的服务器过载而apache / nginx / sql /当你不在时你的网站可能会停机数小时/天

我推荐使用Laravel Queues + Scheduler来处理这些事情。

相关问题