Bonjour.
J'ai trois fonctions importantes dont curlMulti (qui gère via curl_multi_exec, les exécutions ou les traitement multiples en parallèle multithread), getDetails (qui elle permet de récupérer les titres et description de l'URL passé en argument via DomDocument) et la dernière fonction followLinks (qui elle se charge de suivre tous les liens de l'URL en cours de traitement dans la fonction getDetails).
Mon problème est comment appliquer la fonction curlMulti à la fonction followLinks et plus précisément sur la ligne 26 de cette fonction followLinks (ci-dessous) qui appelle la fonction getDetails de sorte à traiter plusieurs URLs à la fois (en parallèle) le plus rapidement possible ???
FONCTION curlMulti:
FONCTION followLinks:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
38 // Fonction pour faire plusieurs requêtes curl asynchrones 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_setopt($ch[$id], CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch[$id], CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch[$id], CURLOPT_FOLLOWLOCATION, 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 // For each cURL session 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 }
ICI LE CODE QUI ME PERMET DE FAIRE APPEL A UNE SEULE ADRESSE URL:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
38 function followLinks($url) { global $alreadyCrawled; global $crawling; $parser = new DomDocumentParser($url); $linkList = $parser->getLinks(); foreach($linkList as $link) { $href = $link->getAttribute("href"); if(strpos($href, "#") !== false) { continue; } else if(substr($href, 0, 11) == "javascript:") { continue; } $href = createLink($href, $url); if(!in_array($href, $alreadyCrawled)) { $alreadyCrawled[] = $href; $crawling[] = $href; getDetails($href); } } // Ici, on supprime le dernier URL traité de la liste de celle qui sont en cours de traitement pour éviter de traiter la même adresse plusieurs: array_shift($crawling); foreach($crawling as $site) { followLinks($site); } }
En d'autres termes, comment passer un tableau d'URLs à la variable $startUrl ci-dessus et traiter chacun des URLs rapidement dans le même temps en parallèle en me servant de la fonction curlMulti dans la fonction followLinks ???
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 $startUrl = "stacloverflow.com"; followLinks($startUrl);
Partager