2010-04-27 6 views
5

Momentan stoppt mein cURL multi exec, wenn eine URL, mit der es verbunden ist, nicht funktioniert, also ein paar Fragen:curl_multi_exec stoppt, wenn eine URL 404 ist, wie kann ich das ändern?

1: Warum hört es auf? Das ergibt für mich keinen Sinn.

2: Wie kann ich es weiter machen?

EDIT: Hier ist mein Code:

$SQL = mysql_query("SELECT url FROM shells") ; 
    $mh = curl_multi_init(); 
    $handles = array(); 
    while($resultSet = mysql_fetch_array($SQL)){  
      //load the urls and send GET data      
      $ch = curl_init($resultSet['url'] . $fullcurl); 
      //Only load it for two seconds (Long enough to send the data) 
      curl_setopt($ch, CURLOPT_TIMEOUT, 5);   
      curl_multi_add_handle($mh, $ch); 
      $handles[] = $ch; 
    } 

    // Create a status variable so we know when exec is done. 
    $running = null; 
    //execute the handles 
    do { 
     // Call exec. This call is non-blocking, meaning it works in the background. 
     curl_multi_exec($mh,$running); 
     // Sleep while it's executing. You could do other work here, if you have any. 
     sleep(2); 
    // Keep going until it's done. 
    } while ($running > 0); 

    // For loop to remove (close) the regular handles. 
    foreach($handles as $ch) 
    { 
     // Remove the current array handle. 
     curl_multi_remove_handle($mh, $ch); 
    } 
    // Close the multi handle 
    curl_multi_close($mh); 
` 
+0

Rufen Sie curl_multi_exec in einer Schleife auf? –

+0

Halten Sie auf el pescado Ich werde den Code – Rob

+0

Posted den Code. – Rob

Antwort

7

Hier gehen Sie:

$urls = array 
(
    0 => 'http://bing.com', 
    1 => 'http://yahoo.com/thisfiledoesntexistsoitwill404.php', // 404 
    2 => 'http://google.com', 
); 

$mh = curl_multi_init(); 
$handles = array(); 

foreach ($urls as $url) 
{ 
    $handles[$url] = curl_init($url); 

    curl_setopt($handles[$url], CURLOPT_TIMEOUT, 3); 
    curl_setopt($handles[$url], CURLOPT_AUTOREFERER, true); 
    curl_setopt($handles[$url], CURLOPT_FAILONERROR, true); 
    curl_setopt($handles[$url], CURLOPT_FOLLOWLOCATION, true); 
    curl_setopt($handles[$url], CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($handles[$url], CURLOPT_SSL_VERIFYHOST, false); 
    curl_setopt($handles[$url], CURLOPT_SSL_VERIFYPEER, false); 

    curl_multi_add_handle($mh, $handles[$url]); 
} 

$running = null; 

do { 
    curl_multi_exec($mh, $running); 
    usleep(200000); 
} while ($running > 0); 

foreach ($handles as $key => $value) 
{ 
    $handles[$key] = false; 

    if (curl_errno($value) === 0) 
    { 
     $handles[$key] = curl_multi_getcontent($value); 
    } 

    curl_multi_remove_handle($mh, $value); 
    curl_close($value); 
} 

curl_multi_close($mh); 

echo '<pre>'; 
print_r(array_map('htmlentities', $handles)); 
echo '</pre>'; 

Returns:

Array 
(
    [http://bing.com] => <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html... 
    [http://yahoo.com/thisfiledoesntexistsoitwill404.php] => 
    [http://google.com] => <!doctype html><html><head><meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"><title>Google</title>... 
) 

Wie Sie alle URLs abgerufen werden sehen können, sogar Google.com, die nach dem 404 Yahoo-Seite kommt.

+0

Super Antwort. Die Dokumentationsseite über Curls Parrarel-Verbindungen ist wirklich beschissen. Vielen Dank! – biphobe

+0

'Wenn Sie curl_multi_exec verwenden, müssen Sie curl_multi_info_read verwenden, um den curl error code zu bekommen https://bugs.php.net/bug.php?id=60660 – Giri

+0

endlich ein paar Multikurbel funktioniert! Vielen Dank – luciomonter

0

Ich habe nicht eine Plattform diese auf prüfen, aber die meisten der Beispiele, die ich gesehen habe, zu vergleichen, die Konstante von curl_multi_exec zurück anstelle der Prüfung der $ laufende Variable.

//execute the handles 
do { 
    // Call exec. This call is non-blocking, meaning it works in the background. 
    $mrc = curl_multi_exec($mh,$running); 
    // Sleep while it's executing. You could do other work here, if you have any. 
    sleep(2); 
// Keep going until it's done. 
} while ($mrc == CURLM_CALL_MULTI_PERFORM); 

Ich hoffe, das funktioniert für Sie.

Verwandte Themen