Search code examples
phphttprequestguzzleguzzle6

Use Guzzle pool instead of guzzle promises


I am using guzzle promises to send a concurrent request but I want to control the concurrency that's why I want to use guzzle pool. How I can transform guzzle promises into guzzle pool. here is my code:

 public function getDispenceryforAllPage($dispencery)
    {
        $GetAllproducts = [];
        $promiseGetPagination = $this->client->getAsync($dispencery)
            ->then(function ($response) {
                return $this->getPaginationNumber($response->getBody()->getContents());           
                });

               $Pagination = $promiseGetPagination->wait();

                $pagearray = array();

                    for($i=1;$i<=$Pagination; $i++){
                        $pagearray[] = $i;

                        }


                foreach($pagearray as $page_no) {

                        $GetAllproducts[] = $this->client->getAsync($dispencery.'?page='.$page_no)
                        ->then(function ($response) {

                            $promise =  $this->getData($response->getBody()->getContents()); 
                            return $promise;       
                            });


        }
       $results =  GuzzleHttp\Promise\settle($GetAllproducts)->wait();
        return $results; 
    }

Solution

  • Just use each_limit() or each_limit_all() (instead of settle()) with a generator.

    function getDispenceryforAllPage($dispencery)
    {
        $promiseGetPagination = $this->client->getAsync($dispencery)
            ->then(function ($response) {
                return $this->getPaginationNumber($response->getBody()->getContents());
            });
    
        $Pagination = $promiseGetPagination->wait();
    
        $pagearray = range(1, $Pagination);
    
        $requestGenerator = function () use ($dispencery, $pagearray) {
            foreach ($pagearray as $page_no) {
                yield $this->client->getAsync($dispencery . '?page=' . $page_no)
                    ->then(function ($response) {
                        return $this->getData($response->getBody()->getContents());
                    });
            }
        };
    
        // Max 5 concurrent requests
        $results = GuzzleHttp\Promise\each_limit_all($requestGenerator(), 5)->wait();
    
        return $results;
    }