【原创】GuzzleHttp 并发测试

背景:获取某商城的商品,遍历变体,调用图片接口上传图片并将其赋值给变体

<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\Pool;
use Psr\Http\Message\ResponseInterface;

set_time_limit(120);
class Test
{
    /**
     * Guzzle HTTP 客户端
     *
     * @var object|Client
     */
    protected object $http;
    private int $concurrency = 5;
    /**
     * 设置 JSON 文件路径
     * 初始化 Guzzle Http 客户端
     */
    public function __construct()
    {
        $this->http = new Client([
            'base_uri' => 'https://xxxxxxxxxxxxx',
            'verify' => false,
            'allow_redirects' => false,
            'headers' => [
                'Authorization' => 'Bearer xxxxxxxxxxxxxxxxxxx',
            ],
        ]);
    }

    public function testProduct()
    {
        $url = 'xxxxxxxxxxxxxxx';
        $response = $this->http->get($url);
        $body = $response->getBody();
        $data = json_decode($body, true);
        $variants = $data['product']['xxxxx'];
        $this->testImage($variants);
    }

    protected function testImage(array $variants): void
    {
        $concurrency = $this->concurrency;
        $client = $this->http;
        $requests = function () use ($client, $variants) {
        $url = '/xxxx';
        foreach ($variants as $v) {
            $data = [
                'image' => [
                'src' => '图片地址',
                'variant_id' => [$v['id']]
               ]
           ];
        yield function () use ($client, $url, $data) {
               $reqOption['json'] = $data;
               $reqOption['verify'] = false;
               return $client->requestAsync('POST', $url, $reqOption);
       };
    }
};
$pool = new Pool($client, $requests(), [
'concurrency' => $concurrency,
'fulfilled' => function (ResponseInterface $response) {
echo "\t=>\tDONE! status:" . $response->getStatusCode() . PHP_EOL;
},
'rejected' => function ($reason, $index) {
echo 'ERROR => ' . strtok($reason->getMessage(), "\n") . PHP_EOL;
},
]);
$promise = $pool->promise();
$promise->wait();
}
}
$startTime = time();
$test = new Test();
$test->testProduct();
$endTime = time();
$useTime = $endTime - $startTime;
echo "cost time:".gmdate("H:i:s", $useTime);
点赞

发表回复

电子邮件地址不会被公开。必填项已用 * 标注