狂饮:将常规请求转换为异步请求

时间:2019-12-13 11:02:41

标签: php laravel guzzle

我有两个尖锐的要求,其中一个需要先完成。我只是使用

sleep(7)
为了确保第一个请求在第二个继续前进之前完全完成,请在两个耗时请求之间使用

。问题在于速度,有时第一个请求可以在一秒钟内完成,或者两次或两次以上,有时可能需要六秒钟。

当前代码:

$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;

这总是返回“未命中”。

做错了什么?

1 个答案:

答案 0 :(得分:0)

关闭函数中的

$test不是全局的。 将test = none移到顶部,然后将函数签名更改为使用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