【问题标题】:How to send big data to API in laravel?如何将大数据发送到 laravel 中的 API?
【发布时间】:2021-10-10 18:14:15
【问题描述】:
public static function send()
    {
        $products = Product::where('active', 1)->get(['id_product', 'price', 'reference'])->load(['images', 'lang']);
        // loop for all products and sending to API
        $number_of_products = count($products);
        $start = 0;
        $end = 70;
        for ($a = 0; $a < ceil($number_of_products/70); $a++) {
            for ($i = $start; $i < $end; $i++) {
                // loop for all images in product
                $count = count($products[$i]->images);
                for ($k = 0; $k < $count; $k++) {
                    $id = (string)$products[$i]->images[$k]->id_image;
                    $products[$i]->images[$k]->id_image = 'https://somesite.com/img/p';
                    $length = strlen($id);
                    // loop for every digit of id_image
                    for ($d = 0; $d < $length; $d++) {
                        $products[$i]->images[$k]->id_image = $products[$i]->images[$k]->id_image . '/' . $id[$d];
                    }
                    $products[$i]->images[$k]->id_image = $products[$i]->images[$k]->id_image . '/' . $id . ".jpg";
                    $images[] = $products[$i]->images[$k]->id_image;
                }
                $products[$i]->images[0] = $images;
                $product = [
                    'code' => $products[$i]->reference,
                    'name' => $products[$i]->lang->name,
                    'price' => round(($products[$i]->price) * 13200, -2),
                    'quantity' => 1,
                    'description' => $products[$i]->lang->description,
                    'images' => $products[$i]->images[0],
                    'url' => 'https://avtech.uz/ru/' . $products[$i]->id_product . '-' . $products[$i]->lang->link_rewrite . '.html',
                ];
                $array_of_products[] = $product;
            }
            // Send 50 products to API
            $response = Http::withToken('token')->post('https://example.com/upload', [
                'company_id' => ******,
                'products' => $array_of_products
            ]);
            if ($response->failed()) {
                Log::channel('send_products_to_pc')->info('Failed: ', [$response]);
            } else {
                Log::channel('send_products_to_pc')->info('Success: ', [$response]);
            }
            $start = $start + 70;
            $end = $end + 70;
        }
}

请帮忙!什么以及如何使此功能成功运行。 在 Postman 中获取“504 网关超时” “允许的内存大小为 134217728 字节已用尽” - 在 laravel.log 中。 我不想增加 memory_limit 因为可能会发生内存泄漏,并且我的脚本无法在 60 秒内发送 1300 个产品。在日志中我可以看到只发送了 500-600 个产品,然后给出了上述错误。

【问题讨论】:

    标签: php laravel http guzzle


    【解决方案1】:

    您应该在回复中使用分页概念。

    例如,如果你要发送 1500 条记录,你可以在max 500 per request 中打破它。

    for page_number=1: return 1-499, 
    for page_number=2: return 500-999,
    for page_number=3: return 1000-1499.
    

    由于不建议在一个请求中发送这么多的大数据。

    【讨论】:

      猜你喜欢
      • 2021-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-22
      • 1970-01-01
      • 1970-01-01
      • 2019-08-26
      相关资源
      最近更新 更多