使用Guzzle PHP循环发送请求很多次

问题描述 投票:0回答:3

我有400条记录要通过服务器上的调用Web服务插入数据库服务器。但是,当我循环插入调用Web服务时,我收到一个错误:

致命错误:未捕获GuzzleHttp \ Exception \ ClientException:客户端错误429请求太多

我试试这段代码:

$http =  new \GuzzleHttp\Client();
        foreach ($data as $key => $value) {
            $response = $http->post('http://192.168.1.33/APIServer/public/api/data', [
            'form_params' => $value,
            ]); 
        }

我循环的所有记录都是400行。如何通过使用Guzzle的Web服务调用插入所有记录。先谢谢了。

php laravel guzzle
3个回答
0
投票

如果要发送数据的服务器没有批量插入端点,则可以在循环中添加wait函数以在请求之间进行一些延迟。


0
投票

GuzzleHttp客户端根据服务器发送的响应代码抛出异常。在您的情况下,第三方在发出一定数量的请求后会向您发送429状态代码的回复。然后由GuzzleHttp\Exception\ClientException抛回。

要解决此问题,您可以使用延迟排队的作业,创建一个作业SendApiRequest

<?php

namespace App\Jobs;

use App\Jobs\Job;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;

class SendApiRequest extends Job implements ShouldQueue
{
    use InteractsWithQueue, SerializesModels;

    /**
     * \GuzzleHttp\Client
     */
    private $http;

    /**
     * Data array
     */
    private $data;

    /**
     * Url string
     */
    private $url = 'http://192.168.1.33/APIServer/public/api/data';

    /**
     * Create a new job instance.
     */
    public function __construct(Client $http, array $data)
    {
        $this->http = $http;
        $this->data = $data;

    }

    /**
     * Create a new peerreview
     *
     * @return void
     */
    public function handle()
    {
        $response = $this->http->post($this->url, $data);

        return $response;
    }
}

然后你可以使用延迟的作业队列调用api(让我们说第三方最多允许每分钟60个请求:

$rateLimitPerMinute  = 60; 
$http =  new \GuzzleHttp\Client();

$counter = 1;
foreach ($data as $key => $value) {

    $delayInMinutes = intval($counter/$rateLimitPerMinute);

    SendApiRequest::dispatch($http, $value)->delay(now()->addMinutes($delayInMinutes));

    $counter++;
}

另外,作为旁注,您可以在作业中获得响应后添加日志记录机制。存储该数据非常重要,以便您可以在以后遇到问题时随时参考。


0
投票

你可以做两件事:

  1. 将所有数据发送到一个请求调用的批量方式,并在服务器端执行foreach。所以你不需要在服务器上发送许多请求。
  2. 第二个是你可以在Laravel的那条路线上remove request limit所以它允许你按顺序发送许多请求 为此,您可以遵循:Disable rate limiter in Laravel?
© www.soinside.com 2019 - 2024. All rights reserved.