2010-01-10 7 views
0

Pourquoi ce code se bloquer? Commentez l'instruction break et cela fonctionne correctement, mais uniquement pour le premier élément du tableau $ sitelist.PHP Curl question

Je connais la fonction multisite de PHP curl, mais je ne suis pas intéressé par l'extraction de fichiers en parallèle.

extrait de code:

$sitelist = array(11204,11509,20602,21601,22003,22704,23106,23303,23402,23422,23427,30215,30220,30234,30282,30302,30304,30905,40110,40122,40204,40406,40624,50144,50304,50408,50409,50801,50807,50904,51001,51502,52212,52219,52233,52604,52606,60703,61020,61022,61024,61502,61602,61901,61905,61909,62102,62114,62803,72301,73503,73801,74903); 

$actliste = array(); 
$recherche =' <a name="JOUR1">'; 

foreach ($sitelist as $site) 
{ 

    # obtain the data at each site 

    // Create a curl handle 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

    $url = sprintf("http://www.cehq.gouv.qc.ca/Suivihydro/tableau.asp?NoStation=0%s", $site); 
    //echo $url . '<br />'; 

    curl_setopt($ch, CURLOPT_URL, $url); 

    $output = curl_exec($ch); // Run curl 
    if ($output === FALSE) 
    { 
     echo 'Curl error retrieving: ' . $url. ' ' . curl_error($ch) . '<br />'; 
     exit; 
    } 

    // Set up a way to detect HTTP anomolies. An HTTP code of 200 is expected 
    $info = curl_getinfo($ch); 
    if ($info['http_code'] <> 200) 
    { 
     echo sprintf("HTTP error code %s returned\n", $info['http_code']); 
     echo strip_tags(sprintf("Message received: %s\n", $output)); 
     exit($info['http_code']); // The HTTP error code is returned so it can be grabbed programatically 
    } 

    echo '0' . $site; 

    // Find: first <td width="33%" until the first </tr> 
    $start_loc = strpos($output, '<td width="33%"'); 
    $end_loc = strpos($output, '</tr>', $start_loc); 
    $substring = substr($output,$start_loc, $end_loc - $start_loc); // Contains all the data we need 

    // Get day 
    $day_pos = strpos($substring, '<font face="Verdana" size="2">') + 30; 
    //echo "Substring = " . $substring . '<br />'; 
    $day = substr($substring,$day_pos,10); // 2010-01-08 
    echo ' ' . $day; 

    // Get time 
    $time_pos = strpos($substring,'<font face="Verdana" size="2">', $day_pos) + 30; 
    $time = substr($substring, $time_pos, 5); 
    echo ' ' . $time; 

    // Get measurement 
    $measurement_pos = strpos($substring,'<font face="Verdana" size="2">', $time_pos) + 30; 
    $measurement = substr($substring, $measurement_pos, 5); 
    echo ' ' . $measurement . '<br />'; 

    curl_close($ch); 
    echo 'Channel closed<br />'; 

    sleep(2); 
    echo 'Done sleeping'; 
    //break; 

} 
+0

Vous dites (ci-dessous) que "ça ne semble pas tellement accrocher que ça prend beaucoup de temps", mais vous ne "s" intéressez pas à la meilleure façon de l'accélérer? – GZipp

+0

Il semble que ce ne soit pas tant pour accrocher que pour prendre beaucoup de temps. Peut-être devrais-je reformuler ceci: je voudrais qu'il fasse écho à la sortie avant la fin du script entier. – Mark

Répondre

1

Vous n'avez pas besoin la pause du tout, comme vous êtes déjà à la fin de la boucle foreach.

Pour ce qui est de savoir pourquoi il est suspendu, vous pouvez flush la sortie à la fin de chaque boucle. Où vous avez actuellement break, mettez flush().

+0

Merci. L'ajout de flush() n'a pas accéléré le processus, mais cela n'a pas d'importance. Je pense que la meilleure façon de collecter ces données est avec un travail cron puis servir les valeurs d'un cache local. – Mark