Php 如何为分层api调用实现作业队列?

Php 如何为分层api调用实现作业队列?,php,laravel,redis,laravel-queue,amazonsellercentral,Php,Laravel,Redis,Laravel Queue,Amazonsellercentral,我正在使用amazon销售合作伙伴api获取订单数据,但要获取完整的数据,我首先需要获取订单和foreach,并将单个订单id传递给不同的端点,以获取其他数据,如buyerinfo、orderItems和addressinfo。目前,我在每个请求之间使用2秒的睡眠,以避免速率限制,即每个ordersapi大约1个请求/秒,整个过程都在do中,直到nextToken不为null,并且该逻辑在控制器中。如何为该进程实现redis队列系统,以便在后台获取数据?我被困在如何在一个作业中分派这些多个请求的

我正在使用amazon销售合作伙伴api获取订单数据,但要获取完整的数据,我首先需要获取订单和foreach,并将单个订单id传递给不同的端点,以获取其他数据,如buyerinfo、orderItems和addressinfo。目前,我在每个请求之间使用2秒的睡眠,以避免速率限制,即每个ordersapi大约1个请求/秒,整个过程都在do中,直到nextToken不为null,并且该逻辑在控制器中。如何为该进程实现redis队列系统,以便在后台获取数据?我被困在如何在一个作业中分派这些多个请求的问题上。我正在使用clousales api

    public function handle()
        {
            Redis::throttle('key')->allow(5)->every(1)->then(function () {
                $apiInstance = new \ClouSale\AmazonSellingPartnerAPI\Api\OrdersApi($this->config);
                try {
                    do {
                        $response = $apiInstance->getOrders($this->marketplaceIds, $this->createdAfter, '', '', '', '', '', '', '', '', $this->maxResultsPerPage, '', $this->nextToken, '');
                        $order = (array) $response['payload']['orders'];
                        // print_r($order[0]['amazon_order_id']); die();
    
                        $buyerInfo = $this->apiInstance->getOrderBuyerInfo($order[0]['amazon_order_id']);
            
                        $orderItems = $this->apiInstance->getOrderItems($order[0]['amazon_order_id']);
                    
                        $addressInfo = $this->apiInstance->getOrderAddress($order[0]['amazon_order_id']);
                    
                        if (!ApiCustomer::where('email', $buyerInfo['payload']['buyer_email'])->exists()) {
                            $customer = ApiCustomer::create([
                            'email'               => $buyerInfo['payload']['buyer_email'] ?? '',
                            'customer_first_name' => $buyerInfo['payload']['buyer_name']  ?? '',
                            'customer_last_name'  => '',
                            'telephone'           => '',
                            ]);
                        }
    
                        // print_r($order);
    
                        if ($order[0]['order_status'] == 'Pending') {
                            $order_status = 1;
                        } elseif ($order[0]['order_status'] == 'Unshipped') {
                            $order_status = 2;
                        } elseif ($order[0]['order_status'] == 'Shipped') {
                            $order_status = 5;
                        } elseif ($order[0]['order_status'] == 'Canceled') {
                            $order_status = 7;
                        }
    
                        if (!ApiOrder::where('order_id', $order[0]['amazon_order_id'])->exists()) {
                            $order = ApiOrder::insert([
                            'order_id'     => $order[0]['amazon_order_id'],
                            'order_total'  => $order[0]['order_total']['amount'] ?? 00.0000,
                            'customer_id'  => $customer->id,
                            'channel_id'   => 2,
                            'order_status' => $order_status,
                            'invoice_no'   => '',
                            'created_at'   => Carbon::parse($order[0]['purchase_date']),
                            'updated_at'   => Carbon::parse($order[0]['last_update_date']),
                        ]);
    
                            foreach ($orderItems['payload']['order_items'] as $item) {
                                if (!ApiOrderProduct::where('order_id', $orderItems['payload']['amazon_order_id'])->exists()) {
                                    ApiOrderProduct::create([
                                    'order_id'     => $orderItems['payload']['amazon_order_id'],
                                    'product_id'   => $item['seller_sku'] ?? '',
                                    'quantity'     => $item['quantity_ordered'],
                                  ]);
                                }
                            }
    
                            // For Customer Address Details
                        // foreach ($addressInfo['payload'] as $info) {
                        //     if (!ApiCustomerDetail::where('order_id', $order[0]['amazon_order_id'])->exists() && !ApiCustomerDetail::where('api_customer_id', $customer->id)->exists()) {
                        //         ApiCustomerDetail::create([
                        //             'order_id' => $order[0]['amazon_order_id'],
                        //             'api_customer_id' => $customer->id,
                        //         ]);
                        //     }
                        // }
                        }
    
                        // print_r($order);
                        // print_r($buyerInfo);
                        // print_r($orderItems);
                        // print_r($addressInfo);
                    
                        // sleep(2);
                        // $response = $this->apiInstance->getOrders($marketplace_ids, $created_after, '', '', '', '', '', '', '', '', $max_results_per_page, '', $next_token, '');
                        DB::table('amazon_temp_data')->where('id', 1)->update(['next_token' => $response['payload']['next_token'], 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]);
                    
                        $this->nextToken = '';
                        if (isset($response['payload']) && isset($response['payload']['next_token'])) {
                            $this->nextToken = $response['payload']['next_token'];
                        }
                    } while ($this->nextToken != '');
                } catch (Exception $e) {
                    Log::info('Exception when calling OrdersV0Api : ', $e->getMessage(), PHP_EOL);
                }
            }, function () {
                return $this->release(2);
            });
        }
我正在初始化构造内部的所有内容,并从控制器中进行调度,如

AmazonRequestsJob::dispatch($marketplace_ids, $max_results_per_page, $created_after, $next_token);

我是队列新手,所以我不知道我是否正确地执行了此操作,因为没有队列系统,执行时间会在一段时间后超过。我尝试增加执行时间,但似乎并不理想。

请展示您迄今为止取得的成就,以便我们更好地了解任何解决方案如何适合您的总体方法。您是否尝试将请求放入单个作业中?不清楚确切的问题是什么/在哪里。由于您是StackOverflow的新手(欢迎!),我建议您选择注册StackOverflow时建议您执行的操作(但我从您的个人资料中可以看出您还没有),然后阅读指南。这样你就能更好地了解一个好问题是什么样子的,然后你可以更新你的问题来提高它的质量,从而提高你得到答案的机会。这些资源可以帮助您在StackOverflow上获得良好的体验,因此请使用它们。谢谢