Php 使用Guzzle时从Do推送请求

Php 使用Guzzle时从Do推送请求,php,guzzle,guzzle6,guzzlehttp,Php,Guzzle,Guzzle6,Guzzlehttp,我的结果数组有一个问题,我最初想要的是这样的 $promises = [ '0' => $client->getAsync("www.api.com/opportunities?api=key&page=1fields=['fields']"), '1' => $client->getAsync("www.api.com/opportunities?api=key&page=2fields=['fields']"), '2'

我的结果数组有一个问题,我最初想要的是这样的

$promises = [
    '0'  => $client->getAsync("www.api.com/opportunities?api=key&page=1fields=['fields']"),
    '1'  => $client->getAsync("www.api.com/opportunities?api=key&page=2fields=['fields']"),
    '2'  => $client->getAsync("www.api.com/opportunities?api=key&page=3fields=['fields']")
];
一个请求承诺数组,我将使用它,因为我想从我正在使用的API中检索数据集合。这就是API第一页的样子

在我的请求中,我想得到第2、3、4页。 这就是第2页的样子

我在PHP脚本上做了一个do-while循环,但它似乎运行一个无限循环 这就是它应该如何工作。首先我运行初始请求,然后得到totalRecordCount=154,如果差值为!=0它再次运行并更改$pageNumber并将其推送到承诺

这是我的功能代码,这是我的代码



function runRequest(){

    $promises = [];
    $client = new \GuzzleHttp\Client();
    $pageCounter = 1;
    $globalCount = 0;

   do {
        //request first and then check if has difference
        $url = 'https://api.com/opportunities_dates?key='.$GLOBALS['API_KEY'].'&page='.$pageCounter.'&fields=["fields"]';

        $initialRequest = $client->getAsync($url);

        $initialRequest->then(function ($response) {
            return $response;
        });

        $initialResponse = $initialRequest->wait();
        $initialBody = json_decode($initialResponse->getBody());

        $totalRecordCount = $initialBody->totalRecordCount;//154 

        $recordCount = $initialBody->recordCount;//100  

        $difference = $totalRecordCount - $recordCount;//54

        $pageCounter++; 
        $globalCount += $recordCount;


        array_push($promises,$url);

   } while ($totalRecordCount >= $globalCount); 
    return $promises;
}

$a = $runRequest();
print_r($a); //contains array of endpoint like in the sample above

有一个无止境的循环,因为当总记录计数等于全局计数时,您会继续循环。第3页及以上有0条记录,因此总数为154条。用
替换
=
将解决循环问题

但是,代码仍然不会像您期望的那样工作。对于每个页面,使用
getAsync()
准备一个请求,并立即执行
wait()
then
语句什么也不做。它返回响应,默认情况下它已经返回了响应。所以在实践中,这些都是同步请求

假设页面大小是恒定的,您可以根据第一个请求中提供的信息计算所需的页面

函数runRequest(){
$promises=[];
$client=new\GuzzleHttp\client();
$url='1https://api.com/opportunities_dates?key=“.$GLOBALS['API_KEY'].&fields=[“fields”]”;
//获取总记录计数和页面计数的初始请求
$initialRequest=$client->getAsync($url.&page=1');
$initialResponse=$initialRequest->wait();
$initialBody=json_decode($initialResponse->getBody());
$promises[]=$initialRequest;
$totalRecordCount=$initialBody->totalRecordCount;//154
$pageSize=$initialBody->pageSize;//100
$nrOfPages=ceil($totalRecordCount/$pageSize);//2
对于($page=2;$page getAsync($url.&page='.$page);
}
回报$3的承诺;
}
$promises=runRequest();
$responses=\GuzzleHttp\Promise\unwrap($promises);
请注意,该函数现在以字符串形式返回承诺,而不是URL


第一个承诺是否已解决并不重要。
unwrap
函数不会导致第1页的另一个GET请求,而是返回现有的响应。对于所有其他页面,请求都是同时完成的。

嘿,谢谢@Arnold,顺便说一句,我这行有一个错误。
$responses=\Guzzle\promise\unwrap($promises)
我需要在文件的最顶端声明一些东西吗?我的错,名称空间是
GuzzleHttp