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

Ily*_*ter 4 php multithreading pthreads beanstalkd laravel

我知道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个线程/工作者会导致代码级别的任何问题吗?

Atr*_*eur 7

laravel排队就是这样做的.

基本上,您必须创建一个Job类.您想要在xml文档上执行的所有繁重工作都需要在此处.然后,将xml从套接字中取出,一旦收到一个文档,就将其推送到Queue上.

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

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

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

  • 一个worker基本上是一个运行命令php artisan queue的php实例:如下所述:http://laravel.com/docs/5.1/queues#running-the-queue-listener如果你只运行一个命令,那么就有一个工人,如果你跑两个,你有两个工人等​​等...我推荐像Supervisor或Foreman这样的东西来管理你产生多少过程. (4认同)