Как бы я автоматизировал мой массив для использования с cURL? - PullRequest
1 голос
/ 27 апреля 2010

У меня есть массив, содержащий содержимое таблицы MySQL. Мне нужно поместить каждое из этих содержимого в curl_multi_handles, чтобы я мог выполнить их все одновременно

Вот код для массива, на случай, если он поможет:

$SQL = mysql_query("SELECT url FROM urls") or die(mysql_error()); 
                    while($resultSet = mysql_fetch_array($SQL)){    
                        $urls[]=$resultSet 
                        }

Так что мне нужно поставить возможность отправлять данные на каждый URL одновременно. Мне не нужно возвращать какие-либо данные, и на самом деле у меня будет время ожидания через две секунды. Нужно только отправить данные и затем закрыть.

Мой код до этого выполнял их по одному. вот этот код:

    $SQL = mysql_query("SELECT url FROM shells") or die(mysql_error());                         while($resultSet = mysql_fetch_array($SQL)){                            
            $ch = curl_init($resultSet['url'] . $fullcurl); //load the urls and send GET data
            curl_setopt($ch, CURLOPT_TIMEOUT, 2);           //Only load it for two seconds (Long enough to send the data)
            curl_exec($ch);
            curl_close($ch);

Итак, мой вопрос: как мне загрузить содержимое массива в curl_multi_handle, выполнить его, а затем удалить каждый дескриптор и закрыть curl_multi_handle?

Ответы [ 2 ]

0 голосов
/ 27 апреля 2010

На вашем месте я написал бы класс mysql и класс curl. Это очень хорошо. Сначала я создал бы метод, который бы возвращал все URL из переданного результата mysql.

Что-то вроде

public function getUrls($mysql_fetch_array)
{
    foreach($mysql_fetch_array as $result)
    {
       $urls[] = $result["url"];
    }                         
}


then you could write a method like curlSend($url,$param)

//remember you have to edit i dont know your full code so its just
// a way you could do it

public function curlSend($url,$param="")
{
$ch = curl_init($resultSet['url'] . $fullcurl); //load the urls and send GET data
            curl_setopt($ch, CURLOPT_TIMEOUT, 2);           //Only load it for two seconds (Long enough to send the data)
            curl_exec($ch);
            curl_close($ch); 

}

public function send()
{
  $urls = getUrls($this->mysql->result($sql));

  foreach($urls as $url)
  {
     $this->curlSend($url);
  }
}

Теперь вот как ты мог это сделать.

0 голосов
/ 27 апреля 2010

Вы по-прежнему вызываете curl_init и curl_setopt. Затем вы загружаете его в multi_handle и продолжаете вызывать execute, пока это не будет сделано. Это основано на документации по curl_multi_init . Поскольку вы рассчитываете время в две секунды, а не обрабатываете ответы, я думаю, вы можете просто спать по две секунды за раз. curl_multi_select может быть лучше, если вам действительно нужно обработать ответы.

    $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, 2);           
            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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...