Php 在返回响应之前等待Guzzle异步请求

Php 在返回响应之前等待Guzzle异步请求,php,laravel,asynchronous,guzzle,Php,Laravel,Asynchronous,Guzzle,我有一个这样的控制器: <?php namespace App\Http\Controllers; use App\Helpers\LogHelper; class ExampleController { public function test() { $client = new \GuzzleHttp\Client(); LogHelper::logTo('s3_logs', 'starting requests');

我有一个这样的控制器:

<?php

namespace App\Http\Controllers;

use App\Helpers\LogHelper;


class ExampleController {
    public function test() {
        $client = new \GuzzleHttp\Client();

        LogHelper::logTo('s3_logs', 'starting requests');
        $p1 = self::testRequest1($client);
        $p2 = self::testRequest2($client);
        $p3 = self::testRequest3($client);

        return response()->json(['success' => true]);
    }

    private static function testRequest1($client) {
        return $client->requestAsync('GET', 'http://www.zara.com/')
            ->then(function($response) {
                LogHelper::logTo('s3_logs', 'resolved from zara.com');
            }, function($e) {
                LogHelper::logTo('s3_logs', 'rejected from zara.com');
            });
    }
    private static function testRequest2($client) {
        return $client->requestAsync('GET', 'http://www.google.com')
            ->then(function($response) {
                LogHelper::logTo('s3_logs', 'resolved from google.com');
            }, function($e) {
                LogHelper::logTo('s3_logs', 'rejected from google.com');
            });
    }
    private static function testRequest3($client) {
        return $client->requestAsync('GET', 'http://httpbin.org/get')
            ->then(function($response) {
                LogHelper::logTo('s3_logs', 'resolved from httpbin.org');
            }, function($e) {
                LogHelper::logTo('s3_logs', 'rejected from httpbin.org');
            });
    }
}
此错误与“响应内容必须是实现_toString()的字符串或对象”有关


在一个狂饮的承诺解决后,我如何才能回应?即使不单独返回响应,为什么我的异步请求没有运行和解析?

多亏了@PtrTron,我找到了正确的答案:

首先,这起了作用:

    $p1->wait();
    $p2->wait();
    $p3->wait();
    return response()->json(['success' => true]);
它不仅起作用了,我还验证了请求的解决也不符合顺序,这意味着它完全是异步的

然后我做了这个工作,稍微好一点:

    $results = \GuzzleHttp\Promise\all([$p1, $p2, $p3])->wait();
    return response()->json(['success' => true]);
您也可以使用

    $results = \GuzzleHttp\Promise\settle([$p1, $p2, $p3])->wait();

如果您没有发现您的承诺被拒绝,则可以通过将
all
中的错误包装在try\catch中来捕获,而
settle
中的错误可以在$results数组中看到,如果该数组的每个成员都是一个关联数组,其属性
状态可以是“拒绝”或“满足”

您的第二种方法接近正确的方法。包含您应该使用的代码。@PtrTon如果您想在评论中获得一些SO分数,请从您链接的内容和我在下面发布的答案中复制您想要的内容。我会选择你的答案作为正确答案。别担心,接受你自己的答案。很高兴你找到了解决问题的办法。
    $results = \GuzzleHttp\Promise\settle([$p1, $p2, $p3])->wait();