20 août 2010

REST_Puller, mitraillette HTTP en PHP

Dans un précédent billet, j'ai présenté le package REST_Client. Comme je l'avais laissé entendre, l'intérêt principal de ce package n'est pas de fournir une interface objet au module cURL. La fonctionnalité principale, celle que l'on trouve difficilement sur le Net, est de fournir une classe capable de lancer des centaines de milliers de requêtes HTTP : REST_Puller

Explications

Si vous connaissez le module cURL, vous savez qu'il propose une série de fonction nommé curl_multi_*. Ces fonctions permettent de lancer en parallèle plusieurs requêtes HTTP. Mais plusieurs ne veut pas dire des centaines de millier, et c'est là que la classe REST_Puller devient intéressante. Avec elle on va pouvoir charger sans interruption plusieurs milliers de requêtes dans une file d'attente qui sera vider progressivement par paquet de requêtes asynchrones. Par vider, j'entends lancement de la requête et récupération de son résultat, le tout s'effectuant en parallèle.

Démonstration

Voici un petit bout de code qui lance 50 000 requêtes avec au maximum 150 clients en parallèle.

  $p = new REST_Puller(array(
            // Pour voir le déroulement des opérations
            'debug' => true,  
   ));

   $requests = 50000; // Nombre de requêtes à tirer
   $clients  = 150;   // Nombre maximum de client à utiliser en parallèle
   $p->setOption('queue_size', $clients);

   $r = new REST_Request('localhost', 8000);

   // On charge le tireur 
   for($i = 0; $i < $requests; $i++) {

      // On tire !!!
      $id = $p->fire($r->get('/'));

      // On peut déjà récupérer les requêtes exécutées
      if ($i > $clients) 
          if (list($k, $h) = $p->fetch()) {
              echo "Request #$k ";
              echo $h->code == 200 ? 'Completed' : 'Failed';
              echo PHP_EOL;
          }
   }

   // On boucle tant que toutes les requêtes ne sont pas terminées
   while(list(, $h) = $p->fetch()) {
       echo 'Request #'.$k;
       echo $h->code == 200 ? 'Completed' : 'Failed';
       echo PHP_EOL;
   }

   // On affiche quelques statistiques
   echo $p->getInfo('requests').PHP_EOL;
   echo $p->getInfo('requests_avg').PHP_EOL;
   echo $p->getInfo('requests_sec').PHP_EOL;
   echo $p->getInfo('fetchs_hit').PHP_EOL;
   echo $p->getInfo('pulls_hit').PHP_EOL;
   echo $p->getInfo('loads_hit').PHP_EOL;
   echo $p->getInfo('time').PHP_EOL; 

Téléchargement et code source

Le code source est disponible sur GitHub : http://github.com/touv/rest_client

Ou, on peut directement l'installer avec PEAR en s'abonnant au Channel Respear :


% pear channel-discover pear.respear.net
% pear install respear/REST_Client

Aucun commentaire:

Enregistrer un commentaire