Comment accéléer la vitesse d'un crawleur en php

Nouveau WRInaute
j'ai écrit un script en php qui fait le crawl d'un site web .mais il prend bq de tepms : environ 1h30 pour donner le resultat
Alors comment je peux accélerer la vitesse de crawling
 
WRInaute accro
La question est trop vague:
- APC/OPcache
- Multithreading
- Bande passante
- Puissance de la machine
- Parser utilisé SimpleXML vs DOMDocument
- ...

Xdebug a un profiler intégré pour analyser ton code.

1h30 pour combien de pages crawlées ?
 
Nouveau WRInaute
environ 20000pages, j'utilise le DOMDocument et je ne sais pas comment travailler avec le multithreading :/
 
Nouveau WRInaute
Multiprocess si tu ne veux pas t'embeter avec les mutex/semaphore du multithreading

=> fonction exec de php

Pour le crawl en lui même plutot que passé par curl ou pire des file_get_contents distant , => fonction socket_select (voir phpsocketdaemon)
 
WRInaute impliqué
De toute façon, c'est trop vague pour donner des précisions qui pourrait l'aider.
- tu connais déjà les 20 000 liens ? Ou tu les récupère au fur et à mesure du crawle ?
- c'est sur le même site ? Est-ce que ce(s) site(s) a/ont un temps de réponse rapide ?
- qu'est-ce que tu récupères dans ces pages ?
- qu'est-ce que tu enregistres ? Et où ? (mysql, fichier, etc.).
- quelle version de PHP utilises-tu ? (bien qu'en beta, j'ai pu faire des tests avec PHP 7 qui a triplé voir quadruplé un système d'analyse de fichier, vraiment impressionnant).

Bref, fait nous un retour complet de ton existant, et le code aussi.
 
Nouveau WRInaute
@Blount
bon !
1-j'ai tésté avec le Xenu : il m'a indiqué le nombre des pages internes traités
2-le but de mon script est d'extraire tous les liens externes et morts (erreur 404) inclus dans les pages d'un site (son url donné en entrée)
3-j'utilise le php 5.4.12
4- l'affichage sur l'ecran
c mon code
exter.php
Code:
<?php 

// It may take a whils to spider a website ... 
   set_time_limit(10000); 

// Inculde the phpcrawl-mainclass 
include_once('../PHPCrawl_083/PHPCrawl_083/libs/PHPCrawler.class.php'); 
 include ('2.php');  
 //include ('crawl3.php');
// Extend the class and override the handleDocumentInfo()-method 
 
class MyCrawler extends PHPCrawler 

{   
function handleDocumentInfo(PHPCrawlerDocumentInfo $DocInfo) {

    if (PHP_SAPI == "cli") $lb = "\n"; 
    else {
	$lb = "<br />"; 
	 $html = @file_get_contents($DocInfo->url);
	 $home_url = parse_url($DocInfo->url ,PHP_URL_HOST );
      $doc = new DOMDocument;
	 libxml_use_internal_errors(true);
     $doc->loadHTML($html);
	 libxml_clear_errors();
	  

// Drop the ->item(0)
$links = $doc->getElementsByTagName('a');

foreach ($links as $link){
     
	//if (substr($link->getAttribute('href'),0,7) == "http://"  and is_valid_url($link->getAttribute('href') === false)){
	$link_url = parse_url($link->getAttribute('href') ,PHP_URL_HOST );
	 
	if (($link_url !== $home_url) and is_valid_url($link->getAttribute('href')) === false ){
    echo $link->getAttribute('href'), PHP_EOL."<br/>";
	echo '<a href = "'.$link->getAttribute('href').'" TARGET=_blank.>'.$link->nodeValue.'</a>'.'<br/>';
	 
	}
	 
}

	 
      
   }
 }
}
$crawler = new MyCrawler(); 
$crawler->setURL("http://www.tunisie-web.org/"); 
 
$crawler->addURLFilterRule("#\.(jpg|gif|png|pdf|jpeg|css|js)$#i"); 
$crawler->setWorkingDirectory("C:/Users/mayss/Documents/travailcrawl/"); 
$crawler->go(); 
//httpwww.annuaire-ag.com
//
 
?>
la foction is_valid_url : (script 2.php)
Code:
 <?php
 
   function is_valid_url($url) {
  $resURL = curl_init();
curl_setopt($resURL, CURLOPT_URL, $url);
 curl_setopt($resURL, CURLOPT_BINARYTRANSFER, 1);
 curl_setopt($resURL, CURLOPT_HEADERFUNCTION, 'curlHeaderCallback');
 curl_setopt($resURL, CURLOPT_FAILONERROR, 1);
curl_exec ($resURL);
$intReturnCode = curl_getinfo($resURL, CURLINFO_HTTP_CODE);
curl_close ($resURL);
if ($intReturnCode == 404) {
    return false;
 }
 else return true;
 }
 
 ?>
 
Discussions similaires
Haut