2010-04-27 7 views
5

Actualmente, mi multi ejecutivo cURL se detiene si una URL a la que se conecta no funciona, por lo que algunas preguntas:curl_multi_exec se detiene si una URL es 404, ¿cómo puedo cambiar eso?

1: ¿Por qué se detiene? Eso no tiene sentido para mí.

2: ¿Cómo puedo hacer que continúe?

EDIT: Aquí está mi código:

$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

¿Está llamando curl_multi_exec en un bucle? –

+0

Espera el pescado Publicaré el código – Rob

+0

Publica el código. – Rob

Respuesta

7

Aquí van:

$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>'; 

Devuelve:

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>... 
) 

Como se puede ver todas las direcciones URL se recuperan, incluso Google.com que viene después de la página 404 Yahoo.

+0

Awesome answer. La página de documentación sobre las conexiones parrarel de curl realmente apesta. ¡Gracias! – biphobe

+0

'Si está usando curl_multi_exec, necesita usar curl_multi_info_read para obtener el código de error de curvatura ' https://bugs.php.net/bug.php?id=60660 – Giri

+0

¡Finalmente funciona un multi rizo! gracias – luciomonter

0

no tengo una plataforma para probar esto en pero la mayoría de los ejemplos que he visto comparar la constante regresaron de curl_multi_exec lugar de revisar el $ ejecutando la 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); 

Espero que esto funcione para usted.

Cuestiones relacionadas