PHP, определяющий многогранные кудри через массив - PullRequest
0 голосов
/ 15 мая 2011

пытается сделать 5 дочерних элементов curl для обработчика curl и определяет их, но не может найти лучший способ .. мой код пока

$curls = array($ch1, $ch2, $ch3, $ch4, $ch5); // have a bad feelin about this
$cont = array($cont1, $cont2, $cont3, $cont4, $cont5); // bad

for($i = 0; $i < count($curls); $i++) { // bad
    $curls[$i] = curl_init();

    curl_setopt($curls[$i], CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curls[$i], CURLOPT_FOLLOWLOCATION, true);

    curl_setopt($curls[$i], CURLOPT_REFERER, $ref);
    curl_setopt($curls[$i], CURLOPT_USERAGENT, $useragent);

    curl_setopt($curls[$i], CURLOPT_COOKIEFILE, $cookiefile);
    curl_setopt($curls[$i], CURLOPT_COOKIEJAR, $cookiefile);

    curl_setopt($curls[$i], CURLOPT_URL, $url);
    curl_setopt($curls[$i], CURLOPT_POST, true);
    curl_setopt($curls[$i], CURLOPT_POSTFIELDS, $data);
    $cont[$i] = curl_exec($curls[$i]); //  bad

    curl_setopt($curls[$i], CURLOPT_URL, $url);
    curl_setopt($curls[$i], CURLOPT_POST, true);
    curl_setopt($curls[$i], CURLOPT_POSTFIELDS, $data);
    $cont[$i] = curl_exec($curls[$i]); // bad
}

И ПОЗЖЕ:

$mh = curl_multi_init();

curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);
curl_multi_add_handle($mh,$ch3);
curl_multi_add_handle($mh,$ch4);
curl_multi_add_handle($mh,$ch5);

это работает или ... это оптимальный путь? кажется немного неровным

Ответы [ 2 ]

1 голос
/ 15 мая 2011

Я бы на самом деле справился с этим другим способом.Я бы сделал одну функцию, которая обрабатывает создание для одного экземпляра curl, с параметрами для настройки параметров переменных по мере необходимости.Это позволяет мне создать один экземпляр или создать цикл для создания нескольких экземпляров.

Дело в том, что многократные вызовы curl зависят от того, был ли предыдущий вызов успешным или нет.Если первая не удалась, я теперь расточительно выделил несколько объектов curl.Создайте первое, запустите его, проверьте ошибки, создайте второе, запустите его, проверьте его и т. Д. Таким образом, вы выделяете только то, что вам нужно.

Редактировать : что-то вроде этого

// get the result of a single curl call
function makeCurlCall($ref, $useragent, $cookiefile, $url, $data)
{
    $curl = curl_init();

    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);

    curl_setopt($curl, CURLOPT_REFERER, $ref);
    curl_setopt($curl, CURLOPT_USERAGENT, $useragent);

    curl_setopt($curl, CURLOPT_COOKIEFILE, $cookiefile);
    curl_setopt($curl, CURLOPT_COOKIEJAR, $cookiefile);

    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_POST, true);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
    $cont = curl_exec($curl);

    // May need to use this later
    $error_no = curl_errno($curl);

    if($error_no) {
      // so we can close before we return
      $result = "[" . $error_no . "] " . curl_error($curl);
      curl_close($curl);
      return array('status' => 'error', 'result' => $result);
    }
    else {
      curl_close($curl);
      return array('status' => 'success', 'result' => $cont);
    }
}

$curl = makeCurlCall($ref, $useragent, $cookiefile, $url, $data);
if($curl['status'] == 'error') {
  // do something for the error
}
else { 
  // do something with $curl['result']
}

// The first call worked, so make the next call, only allocating what we need
$curl = makeCurlCall($ref, $useragent, $cookiefile, $url, $data);

//etc.

Обратите внимание, что вы, вероятно, можете включить функциональность обработки ошибок и успеха, если она достаточно универсальна, но вам все равно придется решать проблему одного скручивания.звонок не работает из-за проблем с сетью и т. д.

0 голосов
/ 16 мая 2011

Вы можете попробовать что-то вроде этого.Я не уверен, что это сработает в вашем сценарии, но это только начало.

function makeCurl($ref, $useragent, $cookiefile, $url, $data){
    $curl = curl_init();

    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);

    curl_setopt($curl, CURLOPT_REFERER, $ref);
    curl_setopt($curl, CURLOPT_USERAGENT, $useragent);

    curl_setopt($curl, CURLOPT_COOKIEFILE, $cookiefile);
    curl_setopt($curl, CURLOPT_COOKIEJAR, $cookiefile);

    curl_setopt($curl, CURLOPT_URL, $url);

    if($data){
        curl_setopt($curl, CURLOPT_POST, true);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
    }

    return $curl;
}

// first let's login

$login = makeCurl($loginref, $useragent, $cookiefile, $loginurl, $logindata);
curl_exec($login);
curl_close($login);

// $cookiefile now has the needed cookies
// for the parallel jobs to run

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

$curls[0] = makeCurl($ref, $useragent, $cookiefile, $url, $data);
$curls[1] = makeCurl($ref, $useragent, $cookiefile, $url, $data);
$curls[2] = makeCurl($ref, $useragent, $cookiefile, $url, $data);
$curls[3] = makeCurl($ref, $useragent, $cookiefile, $url, $data);
$curls[4] = makeCurl($ref, $useragent, $cookiefile, $url, $data);
$curls[5] = makeCurl($ref, $useragent, $cookiefile, $url, $data);

for($i = 0; $i < count($curls); $i++){
    curl_multi_add_handle($mh, $curls[$i]);
}

// use curl_multi_exec to run them and wait for them to finish
// (I've never done this before, so i can't tell you how to do it)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...