首页 > 解决方案 > Guzzle:将常规请求转换为异步请求

问题描述

我有两个 guzzle 请求,其中一个需要在另一个之前完成。我只是使用

sleep(7)

在两个 guzzle 请求之间,以确保第一个请求完全完成,然后再继续执行第二个请求。问题在于速度,有时第一个请求可以在一两秒内完成,或者其他时间可能是六秒以上。

当前代码:

$client = new Client([
   'base_uri' => 'https://ids.w2p-tools.com/',
]);

$response = $client->request('POST', 'd003/requestpreview.php', [
    'form_params' => [
        'auth' => $auth,
         id' => $id,
        'res' => $res,
        'shownonprintlayer' => $show_non_print_layers
    ]
]);

sleep(7);

我试图通过执行以下操作将其转换为异步请求:

$client = new Client([
   'base_uri' => 'https://ids.w2p-tools.com/',
]);

$request = new Request('POST', 'd003/requestpreview.php', [
    'form_params' => [
        'auth' => $auth,
        'id' => $id,
        'res' => $res,
        'shownonprintlayer' => $show_non_print_layers
    ]
]);

$test = 'None Hit';

$promise = $client->sendAsync($request);

$promise->then(
    function (ResponseInterface $res){
        $test = 'ResponseInterface Hit';
    },
    function (RequestException $e) {
        $test = 'RequestException Hit';
    }
);

$response = $promise->wait();

return $test;

这总是返回“无命中”。

做错了什么?

标签: phplaravelguzzle

解决方案


$test在您的闭包函数中不是全局的。将 test = none hit 移到顶部,并更改函数签名以使用 var,因为它不是我们添加 & 以通过引用引用它的对象,这意味着它也会全局更改。

$test = 'None Hit'; // move up here to make it the default

$promise->then(
    function (ResponseInterface $res) use (&$test) { // use $test by reference
        $test = 'ResponseInterface Hit';
    },
    function (RequestException $e) use (&$test) {
        $test = 'RequestException Hit';
    }
);

$response = $promise->wait();

return $test; // should now have text from one of the closures

推荐阅读