Проверка ссылок с помощью Multi-Curl - PullRequest
1 голос
/ 11 ноября 2010

Я создаю функцию проверки ссылок, которая проверяет, имеет ли ссылка код 200/301 / 302.

Я хочу проверить около 1000 ссылок, чтобы использовать функцию Multi-CURL и получить все заголовки, коды и URL-адрес, на который перенаправлен URL-адрес.

Проблема в том, что Multi-CURL выполняется параллельно, добавляя все URL-адреса в curl_multi_add_handle и возвращает полученные результаты, а остальные игнорирует.

Я знаю из заголовка, какой результат я получил, но я не знаю, какой URL принес его. Есть Идентификатор, какой URL я запросил против определенного выполненного дескриптора (может быть что-то связанное с curl_multi_info_read)?

Вот мой код:

$curls = $listofurls;
$curl_arr = array();
          $master = curl_multi_init();

          for($i = 0; $i < $node_count; $i++) {

            $curl_arr[$i] = curl_init($curls[$i][0]);
            curl_setopt($curl_arr[$i],CURLOPT_FRESH_CONNECT,true);
            curl_setopt($curl_arr[$i],CURLOPT_CONNECTTIMEOUT,10);
            curl_setopt($curl_arr[$i],CURLOPT_HEADER,true);
            curl_setopt($curl_arr[$i],CURLOPT_CUSTOMREQUEST,'HEAD');
            curl_setopt($curl_arr[$i],CURLOPT_RETURNTRANSFER,true);
            curl_setopt($curl_arr[$i],CURLOPT_NOBODY,true);
            curl_setopt($curl_arr[$i],CURLOPT_AUTOREFERER, 1);
            curl_setopt($curl_arr[$i],CURLOPT_TIMEOUT,30);

            curl_multi_add_handle($master, $curl_arr[$i]);
          }


          $finalresult = array();

          do{

            curl_multi_exec($master, $running);
            $info = curl_multi_info_read($master);

            if($info['handle']) {
              $finalresult[] = curl_multi_getcontent($info['handle']);
              curl_multi_remove_handle($master, $info['handle']);
            }

          $previousActive = $running;
          }
          while($running > 0);

           curl_multi_close($master);

Ценю Help.Thanx.

1 Ответ

1 голос
/ 25 января 2011

Я понял это - возвращенный ордер, который важно понять и объединить с результатом. Для тех, кто ищет ответ:

      $curls = $listofurls;
      $curl_arr = array();
      $master = curl_multi_init();

      for($i = 0; $i < $node_count; $i++) {

        $curl_arr[$i] = curl_init($curls[$i][0]);
        curl_setopt($curl_arr[$i],CURLOPT_FRESH_CONNECT,true);
        curl_setopt($curl_arr[$i],CURLOPT_CONNECTTIMEOUT,10);
        curl_setopt($curl_arr[$i],CURLOPT_HEADER,true);
        curl_setopt($curl_arr[$i],CURLOPT_CUSTOMREQUEST,'HEAD');
        curl_setopt($curl_arr[$i],CURLOPT_RETURNTRANSFER,true);
        curl_setopt($curl_arr[$i],CURLOPT_NOBODY,true);
        curl_setopt($curl_arr[$i],CURLOPT_AUTOREFERER, 1);
        curl_setopt($curl_arr[$i],CURLOPT_TIMEOUT,30);

        curl_multi_add_handle($master, $curl_arr[$i]);
      }



          $finalresult = array();
          $returnedOrder = array();

          do{

            curl_multi_exec($master, $running);
            $info = curl_multi_info_read($master);

            if($info['handle']) {
              $finalresult[] = curl_multi_getcontent($info['handle']);
              $returnedOrder[] = array_search($info['handle'], $curl_arr, true);
              curl_multi_remove_handle($master, $info['handle']);
              curl_close($curl_arr[end($returnedOrder)]);
            }

          $previousActive = $running;
          }
          while($running > 0);

          $res = array_combine($returnedOrder, $finalresult);
          curl_multi_close($master);
...