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