Pu sh Запрос от Do при использовании Guzzle - PullRequest
0 голосов
/ 18 июня 2020

У меня проблема с моим массивом результатов, я изначально намеревался иметь что-то вроде этого

$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 enter image description here

В моем запросе я хочу получить страницу 2,3,4. Вот как выглядит страница 2 enter image description here

Я сделал do while l oop на моем PHP скрипте, но похоже, что он запускает бесконечный цикл. Вот как это должно быть работай. Сначала я запускаю первоначальный запрос, затем получаю totalRecordCount = 154 и вычитаю его до recordCount = 100, если разница! = 0, он запускает его снова и меняет $ pageNumber и pu sh на обещания.

Это это мой код функции. Вот мой код



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

1 Ответ

1 голос
/ 18 июня 2020

Существует бесконечный l oop, потому что вы продолжаете цикл, когда общее количество записей равно глобальному количеству. Страница 3 и выше имеют 0 записей, поэтому общее количество будет 154. Замена >= на > решит l oop.

Однако код все равно не будет работать так, как вы ожидали. это делать. Для каждой страницы вы составляете запрос с getAsync() и сразу делаете wait(). Оператор then ничего не делает. Он возвращает ответ, который уже выполняется по умолчанию. Так что на практике это все запросы syn c.

Учитывая, что размер страницы постоянный, вы можете рассчитать количество необходимых вам страниц на основе информации, предоставленной в первом запросе.

function runRequest(){

    $promises = [];
    $client = new \GuzzleHttp\Client();
    
    $url = 'https://api.com/opportunities_dates?key='.$GLOBALS['API_KEY'].'&fields=["fields"]';

    // Initial request to get total record count and page count
    $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

    for ($page = 2; $page <= $nrOfPages; $page++) {
        $promises[] = $client->getAsync($url.'&page='.$page);
    }

    return $promises;
}

$promises = runRequest();
$responses = \GuzzleHttp\Promise\unwrap($promises);

Обратите внимание, что функция теперь возвращает обещания, а не URL-адреса в виде строк.

Не имеет значения, что первое обещание уже выполнено. Функция unwrap не вызовет другого запроса GET для страницы 1, но вернет существующий ответ. Для всех остальных страниц запросы выполняются одновременно.

...