Le Multithreading avec curl_multi_init ne marche pas pour moi avec DomDocument

Eléphant du PHP | 137 Messages

27 mars 2021, 22:37

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 : Tout sélectionner

// 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 : Tout sélectionner

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 ???

Mammouth du PHP | 1029 Messages

01 avr. 2021, 18:46

Bonsoir,
On va se mettre d'accord, que je ne comprend pas vraiment ce que vous faites.

Toutefois, il y a quelque chose qui m'interpelle.

En effet dans votre fonction curlMulti() vous retournez un résultat

Code : Tout sélectionner

curl_multi_close($mh); // Fermeture de la multi session cURL return $results; // Renvoie le tableau des résultats
Hors dans votre deuxième fichier, vous n'utilisez pas ce résultat

Code : Tout sélectionner

array_shift($crawling); curlMulti($crawling); foreach ($crawling as $site) { follow_links($site); }
Du coup je me demande si c'est le resultat que vous voulez follow_link ?

Code : Tout sélectionner

array_shift($crawling); $result_curl = curlMulti($crawling); foreach ($result_curl as $site) { follow_links($site); }
L'expérience est la somme de toutes nos erreurs.