27 votes

Est-il possible de faire des requêtes HTTP asynchrones avec PHP?

J'ai un script PHP qui a besoin de télécharger plusieurs fichiers à partir d'un serveur distant. Pour le moment j'ai juste une boucle de téléchargement et le traitement des fichiers avec cURL, ce qui signifie qu'il ne veut pas démarrer le téléchargement d'un fichier jusqu'à ce que la précédente est terminée - ce qui augmente le script de s'exécuter de manière significative.

Serait-il possible de lancer plusieurs instances de roulage, par exemple, de manière asynchrone télécharger ces fichiers en même temps, sans attendre que la précédente à la fin? Si oui, comment cela peut-il être réalisé?

16voto

bl00dshooter Points 759

Oui.

Il y a cette bibliothèque PHP: http://code.google.com/p/multirequest/ (c'est une bibliothèque CURL multithread).

Comme autre solution, vous pouvez écrire un script qui le fait dans un langage qui prend en charge le threading, comme Ruby ou Python. Ensuite, appelez simplement le script avec PHP. Semble assez simple.

13voto

stil Points 352

Découvrez curl-easy . Il prend en charge les demandes bloquantes et non bloquantes en parallèle ou une seule demande à la fois. En outre, il est testé unitaire contrairement à de nombreuses bibliothèques simples ou boguées.

Divulgation: je suis l'auteur de cette bibliothèque. Je dis juste. La bibliothèque a sa propre suite de tests, donc je suis assez confiant qu'elle est robuste.

Consultez également l'exemple d'utilisation ci-dessous:

 <?php
// We will download info about 2 YouTube videos:
// http://youtu.be/XmSdTa9kaiQ and
// http://youtu.be/6dC-sm5SWiU

// Init queue of requests
$queue = new cURL\RequestsQueue;
// Set default options for all requests in queue
$queue->getDefaultOptions()
    ->set(CURLOPT_TIMEOUT, 5)
    ->set(CURLOPT_RETURNTRANSFER, true);
// Set callback function to be executed when request will be completed
$queue->addListener('complete', function (cURL\Event $event) {
    $response = $event->response;
    $json = $response->getContent(); // Returns content of response
    $feed = json_decode($json, true);
    echo $feed['entry']['title']['$t'] . "\n";
});

$request = new cURL\Request('http://gdata.youtube.com/feeds/api/videos/XmSdTa9kaiQ?v=2&alt=json');
$queue->attach($request);

$request = new cURL\Request('http://gdata.youtube.com/feeds/api/videos/6dC-sm5SWiU?v=2&alt=json');
$queue->attach($request);

// Execute queue
$queue->send();
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X