par
chegmarco » 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 ???
Bonjour.
J'essaie d'utiliser le [B]MultiThreading[/B] en PHP en me servant de [B]curl_multi_init[/B] et de [B]DomDocument[/B] dont voici les codes:
[B]CODE MULTI-THREADING: [/B]
[CODE]// 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
}[/CODE]
Mon problème est que quand j'essaie d'appeler la fonction [B]curlMulti($crawling);[/B] sur la [B]ligne 29[/B] de l'explorateur [B]DomDocument[/B] du code ci-après, [B]rien ne marche[/B]:
[CODE]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);[/CODE]
Comment donc réussir à corriger mes deux codes pour que l'exploration de plusieurs liens en parallèle ([B]multi-crawling[/B]) se fasse avec succès et sans aucun souci ???