Faire du Multithread avec curl_multi_init
Bonjour.
J'essaie d'utiliser le MultiThreading en PHP en me servant de curl_multi_init et de DomDocument dont voici les codes:
CODE MULTI-THREADING:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| // Fonction pour faire plusieurs requêtes curl asynchrones (asynchrones: à la fois)
function curlMulti($urls) {
$mh = curl_multi_init(); // Initialisation de la multi session cURL
// For each of the URLs in array
foreach ($urls as $id => $d) {
$ch[$id] = curl_init(); // Initialisation de la session cURL
$url = (is_array($d) && !empty($d['url'])) ? $d['url'] : $d;
curl_setopt($ch[$id], CURLOPT_URL, $url);
curl_setopt($ch[$id], CURLOPT_RETURNTRANSFER, TRUE);
curl_multi_add_handle($mh, $ch[$id]); // Ajout de sessions cURL à cURL multi session
}
$running = NULL; // Définit $running sur NULL
do {
curl_multi_exec($mh, $running); // Exécution de plusieurs sessions cURL en parallèle
} while ($running > 0); // Tant que $running est supérieur à zéro
// Pour chaque Session cURL
foreach($ch as $id => $content) {
$results[$id] = curl_multi_getcontent($content); // Ajoute des résultats au tableau $results
curl_multi_remove_handle($mh, $content); // Supprimer cURL multi session
}
curl_multi_close($mh); // Fermeture de la multi session cURL
return $results; // Renvoie le tableau des résultats
} |
Mon problème est que quand j'essaie d'appeler la fonction curlMulti($crawling); sur la ligne 29 de l'explorateur DomDocument du code ci-après, rien ne marche:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| function follow_links($url) {
// Give our function access to our crawl arrays.
global $already_crawled;
global $crawling;
$options = array('http'=>array('method'=>"GET", 'headers'=>"User-Agent: hBot/0.1\n"));
$context = stream_context_create($options);
$doc = new DOMDocument();
$doc->loadHTMLFile($url);
$linklist = $doc->getElementsByTagName("a");
foreach ($linklist as $link) {
$l = $link->getAttribute("href");
if (!in_array($l, $already_crawled)) {
$already_crawled[] = $l;
$crawling[] = $l;
echo get_details($l)."\n";
}
}
array_shift($crawling);
curlMulti($crawling);
foreach ($crawling as $site) {
follow_links($site);
}
}
follow_links($start); |
Comment donc réussir à corriger mes deux codes pour que l'exploration de plusieurs liens en parallèle (multi-crawling) se fasse avec succès et sans aucun souci ???