php - Guzzle 正在同步发送请求

标签 php asynchronous concurrency guzzle6

我正在使用 Guzzle 来使用 SOAP API。我必须提出 6 个请求,但在未来,这甚至可能是不确定数量的请求。

问题是请求正在发送同步,而不是异步。每个请求本身都需要 +-2.5 秒。当我并行发送所有 6 个请求时(至少那是我正在尝试的)它需要 +- 15s..

我尝试了 Guzzle 上的所有示例,一个带有 $promises 的固定数组,甚至还有池(我最终需要)。当我将所有内容放入 1 个文件(功能)时,我设法将总时间恢复到 5-6 秒(这没问题吧?)。但是,当我以某种方式将所有内容放入对象和函数时,我会做一些让 Guzzle 决定再次同步它们的事情。

Checks.php:

    public function request()
    {
        $promises = [];
        $promises['requestOne'] = $this->requestOne();
        $promises['requestTwo'] = $this->requestTwo();
        $promises['requestThree'] = $this->requestThree();
        // etc

        // wait for all requests to complete
        $results = \GuzzleHttp\Promise\settle($promises)->wait();

        // Return results
        return $results;
    }

    public function requestOne()
    {
         $promise = (new API\GetProposition())
            ->requestAsync();
         return $promise;
    }            

    // requestTwo, requestThree, etc

API\GetProposition.php

public function requestAsync()
{
    $webservice = new Webservice();
    $xmlBody = '<some-xml></some-xml>';
    return $webservice->requestAsync($xmlBody, 'GetProposition');
}

Webservice.php

public function requestAsync($xmlBody, $soapAction)
{
    $client = new Client([
        'base_uri' => 'some_url',
        'timeout'  => 5.0
    ]);

    $xml = '<soapenv:Envelope>
       <soapenv:Body>
          '.$xmlBody.'
       </soapenv:Body>
    </soapenv:Envelope>';

    $promise = $client->requestAsync('POST', 'NameOfService', [
        'body'    => $xml,
        'headers' => [
            'Content-Type' => 'text/xml',
            'SOAPAction'   => $soapAction, // SOAP Method to post to
        ],
    ]);

    return $promise;
}

我更改了 XML 和一些缩写参数。结构是这样的,因为我最终不得不针对多个 API 进行讨论,这就是为什么我在两者之间有一个 webservice 类,它完成该 API 所需的所有准备工作。大多数 API 都有多种可以调用的方法/操作,这就是为什么我有类似的东西。 API\GetProposition.

->wait() 语句之前,我可以看到所有待处理的 $promises。所以看起来有发送异步。在 ->wait() 之后,它们都已完成。

一切正常,只是性能有所下降。所有 6 个请求都不会超过 2.5 到最多 3 秒。

希望有人能帮忙。

尼克

最佳答案

问题是 $client 对象是在每次请求时创建的。导致 curl multi curl 无法知道要使用哪个处理程序。 通过 https://stackoverflow.com/a/46019201/7924519 找到答案.

关于php - Guzzle 正在同步发送请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47894288/

相关文章:

java - 在检查 ConcurrentHashMap 中是否存在 key 时,是否需要客户端锁定?

php - 如何在 laravel 项目中使用 vendor 文件夹中的类

javascript - jQuery Slick slider 数据从 Ajax 每秒使用 setInterval 获取

php - 如何从我的脚本中获取网站的 Google 排名?

python - 在 Python 中使用 asyncio 并行化 Web 任务

php - Thrift 异步函数中的回调?

PHP 插入数字不起作用?

C# 异步文件传输 - 在继续循环之前等待

java - 带有 mongodb bson 库的 Mongodb 驱动程序在单独的项目中使用时会导致 completableFuture 挂起

c - fork() 和 pipeline() 的竞争条件