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:

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
}
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
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);
	}
 
}
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
$startUrl = "stacloverflow.com";
followLinks($startUrl);
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 ???