curl_multi_exec останавливается, если один URL 404, как я могу изменить это?

В настоящее время мое ВИХРЕВОЕ много должностное лицо останавливается, если один URL, с которым это соединяется, не работает, так несколько вопросов:

1: Почему это останавливается? Это не имеет смысла мне.

2: Как я могу заставить его продолжиться?

Править: Вот мой код:

    $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);
`
5
задан Alix Axel 20 May 2010 в 15:20
поделиться

2 ответа

Вот так:

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

Возвраты:

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

Как вы можете видеть, все URL-адреса найдены, даже Google.com, который приходит после 404-й страницы Yahoo.

7
ответ дан 14 December 2019 в 08:45
поделиться

У меня нет платформы, на которой можно было бы это проверить, но большинство примеров, которые я видел, сравнивают константу, возвращаемую curl_multi_exec, вместо проверки переменной $running.

//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);

Надеюсь, это сработает для вас.

0
ответ дан 14 December 2019 в 08:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: