PHP Curl multi-exec запросы не возвращают все данные - PullRequest
1 голос
/ 14 декабря 2011

Мне нужен совет по отладке кода ниже, пожалуйста.

Я передаю в Twitter идентификаторы пользователей из $ userIDArray.Из-за ограничений Twitter мне приходится разбивать вызовы на партии по 100. Таким образом, если $ userIDarray содержит 512 пользователей, я делаю 6 одновременных вызовов с использованием curl_multi_exec.

Когда я смотрю данные возврата первымпакет из 100 ответов всегда в порядке, затем я получаю пакеты только с 0 и 1 результатами.Итак, из 512 пользователей я могу получить информацию о возврате только за 120.

Как мне узнать, что происходит с этими звонками, пожалуйста?

function getUserInfo()
{
    global $userIDArray;
    global $counter;
    global $userInfoArray;
    $handleArray = array();

    $requiredCalls = ceil($counter / 100);
    echo "Calls ".$requiredCalls."</br>";

    $mh = curl_multi_init();

    for($i = 0; $i < $requiredCalls; $i++) 
    {
        $counterLow = $counter - 100;

        if($counterLow < 0)
        {
            $counterLow = 0;    
        }

        //Take only 100 items
        $outputUIDArray = array_slice($userIDArray,$counterLow, $counter);

        //Implode array to string of user ids
        $uids = implode(",", $outputUIDArray);
        //echo "UIDs = ".$uids;

        $handle=curl_init();
        curl_setopt($handle,CURLOPT_URL,'https://api.twitter.com/1/users/lookup.json?user_id='.$uids.'&include_entities=false');
        curl_setopt($handle, CURLOPT_RETURNTRANSFER, 1);


        $handleArray[] = $handle;

        curl_multi_add_handle($mh,$handleArray[$i]);

        echo "Counter low ".$counterLow." Counter high ".$counter."</br>";

        $counter -= 100;
    }

    $active = null;
    //execute the handles
    do {
        $mrc = curl_multi_exec($mh, $active);
        } while ($mrc == CURLM_CALL_MULTI_PERFORM);

    while ($active && $mrc == CURLM_OK) {
        if (curl_multi_select($mh) != -1) {
            do {
                $mrc = curl_multi_exec($mh, $active);
            } while ($mrc == CURLM_CALL_MULTI_PERFORM);
        }
    }


    for($i = 0; $i < $requiredCalls; $i++) 
    {   
        //Get result
        $result = curl_multi_getcontent ($handleArray[$i]);
        //echo( $i . "\n" . $results . "\n");

        $json_a=json_decode($result,true);
        echo count($json_a)."</br>";
        //print_r($json_a);

        for($j = 0; $j < count($json_a); $j++)
        {
            $userInfoArray[] = $json_a[$j];
        }

        var_dump(curl_multi_info_read($mh));
        echo"</br>";

        //close the handles
        curl_multi_remove_handle($mh, $handleArray[$i]);
    }


    curl_multi_close($mh);  

    echo "Results in final array ".count($userInfoArray);}

1 Ответ

2 голосов
/ 15 декабря 2011

Я неверно истолковал, как работает срез массива

$outputUIDArray = array_slice($userIDArray,$counterLow, $counter);

Должно быть

$outputUIDArray = array_slice($userIDArray,$counterLow, 100);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...