requests

  • Guzzle is a great wrapper to run Curl requests from your PHP applications

    As part of my development requirements for MyReviews.link, I had to implement a fast concurrent way to perform http requests to several servers. 

    With Guzzle Promises this can be achieved in a very simplified way. Here is the example

     

    $client=newGuzzleClient(['timeout'=>12.0]); // see how i set a timeout

    //
    $requestPromises= [];
    $sitesArray= SiteEntity->getAll(); // returns an array with objects that contain a domain

    foreach($sitesArray as$site)
    {
    $requestPromises[$site->getDomain()] =$client->getAsync('http://'.$site->getDomain());
    }

    $results= GuzzlePromise\settle($requestPromises)->wait();

    foreach($resultsas$domain=>$result)
    {
    $site=$sitesArray[$domain];
    $this->logger->info('Crawler FetchHomePages: domain check '.$domain);

    if($result['state'] ==='fulfilled')
    {
    $response=$result['value'];
    if($response->getStatusCode() ==200)
    {
    $site->setHtml($response->getBody() );
    }
    else{
    $site->setHtml($response->getStatusCode() );
    }
    }
    else if($result['state'] ==='rejected'){ // notice that if call fails guzzle returns is as state rejected with a reason.

    $site->setHtml('ERR: '.$result['reason'] );
    }
    else{
    $site->setHtml('ERR: unknown exception ');
    $this->logger->err('Crawler FetchHomePages: unknown fetch fail domain: '.$domain );
    }

    $this->entityManager->persist($site); // this is a call to Doctrines entity manager
    }

    I hope the above helped.

    Feel free to send me a message through the contact us link, Github or Linkedin

Popular Links