Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在后台运行异步作业(laravel)_Php_Multithreading_Laravel_Pthreads_Beanstalkd - Fatal编程技术网

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

Php 在后台运行异步作业(laravel),php,multithreading,laravel,pthreads,beanstalkd,Php,Multithreading,Laravel,Pthreads,Beanstalkd,我知道Laravel的队列驱动程序,如redis和beanstalkd,我读到可以增加beanstalkd等的工作人员数量。但是我不确定这些解决方案是否适合我的场景。这是我需要的 我通过套接字连接收听XML提要,数据一直在快速传输。永远。我在一秒钟内得到数十个XML文档 我逐行从这个套接字读取数据,一旦到达XML结束标记,我就将缓冲区发送给另一个进程进行解析。我过去只是在base64中对xml进行编码,并为每个xml运行单独的php进程shell_exec('php parse.php.$bas

我知道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个线程/工作线程会在代码级别上引起任何问题吗

laravel排队就是为了这个

基本上,你必须创建一个。您想要在xml文档上完成的所有繁重工作都需要在这里完成。 然后,从套接字中取出xml,一旦收到一个文档

稍后,队列工作人员将从队列中取出它,并执行繁重的工作

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


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

经过进一步的研究,我发现。我在文件中遗漏了那一部分。我真傻。我仍然想知道,对于像我这样的情况,这个主管工具是否可以处理数百名工人。希望有人能分享他们的经验,但如果没有,我会在本周进行性能测试后更新这个答案

我根据经验告诉您,shell_exec()不是在PHP中运行异步任务的理想方式。 在开发时似乎还可以,但如果您有一个小型vps(1-2GB ram),您的服务器可能会过载,apache/nginx/sql/某些东西可能会在您不在时停止运行,并且您的网站可能会关闭数小时/数天


我推荐Laravel Queues+Scheduler来完成这类工作。

非常感谢您的帮助,但老实说,我真正想知道的是如何设置可以同时运行的工作进程数。工作进程基本上是一个运行命令php artisan queue:listen的php实例,如下所述:如果您只运行一个命令,有一个工人,如果你运行两个,你就有两个工人,以此类推。。。我建议使用主管或工头之类的方法来管理您生成的流程数量。