Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/233.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_Laravel_Parallel Processing_Queue - Fatal编程技术网

Php 大量数据集的批处理Laravel

Php 大量数据集的批处理Laravel,php,laravel,parallel-processing,queue,Php,Laravel,Parallel Processing,Queue,我目前在laravel中有一个Cron,它以块的形式获取数据并调用API 流量如下所示 1. Cron runs every 5 minutes 2. Takes 80 data in chunks 3. Loop it through and call an API for 80 times and takes the next 80 in the next cron cycle 此方法非常慢,如果表中有10000000条记录,则处理它将需要很多次。我之前使用了1000块,这破坏了我的系统,

我目前在laravel中有一个Cron,它以块的形式获取数据并调用API

流量如下所示

1. Cron runs every 5 minutes
2. Takes 80 data in chunks
3. Loop it through and call an API for 80 times and takes the next 80 in the next cron cycle
此方法非常慢,如果表中有10000000条记录,则处理它将需要很多次。我之前使用了1000块,这破坏了我的系统,说“打开的文件太多”异常,我已经将块从1000减少到80

我知道这是我正在做的一个非常糟糕的设计

我需要重新构建当前模型,并构建能够并行处理的东西。至少500-1000并行处理数据

在拉威尔我该怎么做。甚至可以通过PHP实现吗?或者我必须考虑像nodejs这样的选项吗?如果可以使用队列,请帮助我。即使我使用队列,我也能通过它进行并行处理吗

更新

现在我尝试使用Laravel队列

在后台运行的命令

php /Users/ajeesh/PhpstormProjects/untitled3/open-backend-v2/artisan queue:work database --tries=1 --timeout=56
我的工作被处理了三次。我不明白为什么


有人能在此提出解决方案吗?

要运行并行作业,您需要安装一个管理器,如“Supervisor”,它将为您提供各种工作人员(实例)。您可以设置服务器资源所能处理的工作人员数量

请记住,每个worker都是laravel应用程序的不同实例,反映了它创建时的状态。如果您对相关代码(如作业的代码)进行了更改,则需要重新启动主管,以便它可以获得更新的版本

接下来,您必须为调度的每个作业设置一种方式,以要求正确的可用块

作业1将获得区块1到80。 作业2将获得块81到160。

您还没有详细说明您的代码,也许这不会是一个问题,但是如果是,您可以创建一个数据库表来跟踪可用的块和尚未处理的块

关于你的工作被解雇3次,代码如下:

php /Users/ajeesh/PhpstormProjects/untitled3/open-backend-v2/artisan queue:work database --tries=1 --timeout=56
它的功能是分派队列中已经存在的作业。也许另一段代码将作业排队3次


安装“Supervisor”后,无需手动分派作业。它将跟踪您的作业,并在作业到达时立即发送(如果您以这种方式配置它们)。

在我们找到最佳解决方案之前,您必须回答几个关键问题:

  • 这些API调用是独立的吗?如果调用相互依赖,则无法进行并行处理。例如:假设您正在筛选页面,而API调用在上一个调用中提供了下一个页面的URL,那么它们是依赖调用,除非其中有模式,否则无法使用并行处理

  • 为什么作业会多次调用API?是否有替代方案(如批量操作API)

  • 你在问题中提到了一张桌子。您是否遍历一个表并为每个记录执行一个API调用

  • 你的工作可能会被呼叫3次,因为他们因超时而失败,而你已将试用次数设置为3次。如果您有一个
    失败的\u作业
    表设置,请检查它以查看错误(我猜是超时)


    有几种解决这些问题的方法。队列、流程工人、组合等都是可能的解决方案,但必须谨慎处理。更好的方法是最小化API调用(如果可能)。响应后将更新答案。

    调用API 80次?您使用的是哪个版本的laravel?你能解释一下为什么每五分钟调用太多API吗?作业运行了3次,这是因为作业失败了。失败的作业(默认情况下)将运行3次。您能否验证作业是否失败(通过查看queue:work的输出)?