Guzzle PHP

时间:2019-02-18 09:16:59

标签: php laravel guzzle

我想通过调用服务器上的Web服务将400条记录插入数据库服务器。但是,当我通过调用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服务调用插入所有记录。预先感谢。

3 个答案:

答案 0 :(得分:0)

您可以做两件事:

  1. 将所有数据批量发送到一个请求调用中,并在服务器端执行foreach。因此您无需在服务器上发送许多请求。

  2. 第二个是您可以remove request limit在Laravel的那条路线上,这样您就可以按顺序发送许多请求

    为此,您可以按照以下步骤操作:Disable rate limiter in Laravel?

答案 1 :(得分:0)

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

答案 2 :(得分: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++;
}

此外,还可以在工作中获得响应后添加日志记录机制。存储该数据很重要,这样您在遇到问题时可以随时参考。