Не удалось получить ответ при использовании curl в PHP - PullRequest
0 голосов
/ 31 августа 2018

Я извлекаю данные, используя curl в php, но при наличии большого количества данных возвращается 0. Я предоставляю свой код ниже.

 $result = array();
// multi handle
$mh = curl_multi_init();
$idArr=[2,147,92];
foreach ($idArr as $key => $value) {
    $fetchURL = "http://example.com/index.php/rest/V1/categories/".$value."/products/";
    //echo $fetchURL.'<br>';
    $multiCurl[$key] = curl_init();
    curl_setopt($multiCurl[$key], CURLOPT_URL,$fetch_url);
    curl_setopt($multiCurl[$key], CURLOPT_CUSTOMREQUEST, "GET");
    curl_setopt($multiCurl[$key], CURLOPT_HEADER,array("Content-Type: application/json", "Authorization: Bearer " . json_decode($token)));
    curl_setopt($multiCurl[$key], CURLOPT_RETURNTRANSFER,true);
    curl_multi_add_handle($mh, $multiCurl[$key]);
}
$index=null;
do {
  curl_multi_exec($mh,$index);
} while($index > 0);
// get content and remove handles
foreach($multiCurl as $k => $ch) {
  $result[$k] = curl_multi_getcontent($ch);
  curl_multi_remove_handle($mh, $ch);
}
// close
curl_multi_close($mh);
print_r($result);

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

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Я думаю, что вы не можете получить ответ из-за неправильной установки переменной в параметре curl. Ваша третья строка в цикле foreach должна быть такой:

curl_setopt($multiCurl[$key], CURLOPT_URL,$fetchURL);

также вы пишете неправильный синтаксис для опции заголовков заменить CURLOPT_HEADER на CURLOPT_HTTPHEADER

вот пример кода, который отлично работает

$idArr=[20,18,21];

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

    $curl_objs_arr = [];
    foreach ($idArr as $key => $cat) {
        $fetchURL = "http:example.com/v2/products?category=".$cat;

        $requests[$key] = curl_init($fetchURL);

        curl_setopt($requests[$key], CURLOPT_URL,$fetchURL);
        curl_setopt($requests[$key], CURLOPT_CUSTOMREQUEST, "GET");
        curl_setopt($requests[$key], CURLOPT_HTTPHEADER,array("Content-Type: application/json","Authorization: Bearer " . json_decode($token)));
        curl_setopt($requests[$key], CURLOPT_RETURNTRANSFER,true);

        curl_multi_add_handle($mh, $requests[$key]);
    }

    $running = null;
    do {
       curl_multi_exec($mh, $running);
    } while($running > 0);

    foreach ($requests as $key => $request) {
        $result[$key] = curl_multi_getcontent($request);
        curl_multi_remove_handle($mh, $request);
    }
    curl_multi_close($mh);

    echo "<pre>";
    print_r($result);exit;

установите свой код таким образом, это решит вашу проблему.

0 голосов
/ 31 августа 2018

Вам не хватает реализации "curl_multi_select". Я сделал это для вас, но не проверял. Попробуй

$result = array();
// multi handle
$mh = curl_multi_init();
$multiCurl = array();
$idArr=[2,147,92];
foreach ($idArr as $key => $value) {
$fetchURL = "http://example.com/index.php/rest/V1/categories/".$value."/products/";
//echo $fetchURL.'<br>';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$fetch_url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($ch, CURLOPT_HEADER,array("Content-Type: application/json", "Authorization: Bearer " . json_decode($token)));
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
$multiCurl[$key] = $ch;
curl_multi_add_handle($mh, $ch);
}

$active =null;
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);
  }
}   
foreach($multiCurl as $k => $ch) {
 $result[$k] = curl_multi_getcontent($ch);
 curl_multi_remove_handle($mh, $ch);
}
// close
curl_multi_close($mh);
print_r($result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...