在PHP中更快地处理多个cURL请求

在PHP中更快地处理多个cURL请求,php,json,http,curl,python-requests,Php,Json,Http,Curl,Python Requests,我试图通过高效地处理cURL请求来加速我的网站。我正在运行大约3个请求,其中两个请求指向同一个服务器。这是我的密码: $profile = curl_init(); curl_setopt($profile, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($profile, CURLOPT_RETURNTRANSFER, true); curl_setopt($profile, CURLOPT_FAILONERROR, true); curl_setop

我试图通过高效地处理cURL请求来加速我的网站。我正在运行大约3个请求,其中两个请求指向同一个服务器。这是我的密码:

$profile = curl_init();
curl_setopt($profile, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($profile, CURLOPT_RETURNTRANSFER, true);
curl_setopt($profile, CURLOPT_FAILONERROR, true);
curl_setopt($profile, CURLOPT_URL,"https://owapi.net/api/v2/u/".$battletag."/stats/".$mode."?platform=".$platform);
$result = curl_exec($profile); //grab API data
curl_close($profile);
$stats = json_decode($result, true); //decode JSON data


$profile1 = curl_init();
curl_setopt($profile1, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($profile1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($profile1, CURLOPT_FAILONERROR, true);
curl_setopt($profile1, CURLOPT_URL,"https://api.lootbox.eu/".$platform."/us/".$battletag."/profile");
$result1 = curl_exec($profile1); //grab API data
curl_close($profile1);
$stats1 = json_decode($result1, true); 

$hero_stats = curl_init();
curl_setopt($hero_stats, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($hero_stats, CURLOPT_RETURNTRANSFER, true);
curl_setopt($hero_stats, CURLOPT_FAILONERROR, true);
curl_setopt($hero_stats, CURLOPT_URL,"https://api.lootbox.eu/".$platform."/us/".$battletag."/competitive-play/heroes");
$hero_play_time = curl_exec($hero_stats); //grab API data
curl_close($hero_stats);
$heroes_info = json_decode($hero_play_time, true);
如何在不重新启动连接的情况下同时处理这些请求?我想加快我的网站加载时间,因为现在,这需要很长时间。任何帮助都将不胜感激。我听说过curl\u multi\u init()方法,但我不确定如何正确使用它。欢迎任何帮助


谢谢。

好的,谢谢所有的帮助。尤其是安德鲁

我找到了一个最终有效的解决方案。在这里为其他有类似问题的人发布

function multiRequest($data, $options = array()) {

  // array of curl handles
  $curly = array();
  // data to be returned
  $result = array();

  // multi handle
  $mh = curl_multi_init();

  // loop through $data and create curl handles
  // then add them to the multi-handle
  foreach ($data as $id => $d) {

    $curly[$id] = curl_init();

    $url = (is_array($d) && !empty($d['url'])) ? $d['url'] : $d;
    curl_setopt($curly[$id], CURLOPT_URL,            $url);
    curl_setopt($curly[$id], CURLOPT_HEADER,         0);
    curl_setopt($curly[$id], CURLOPT_RETURNTRANSFER, 1);

    // post?
    if (is_array($d)) {
      if (!empty($d['post'])) {
        curl_setopt($curly[$id], CURLOPT_POST,       1);
        curl_setopt($curly[$id], CURLOPT_POSTFIELDS, $d['post']);
      }
    }

    // extra options?
    if (!empty($options)) {
      curl_setopt_array($curly[$id], $options);
    }

    curl_multi_add_handle($mh, $curly[$id]);
  }

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


  // get content and remove handles
  foreach($curly as $id => $c) {
    $result[$id] = json_decode(curl_multi_getcontent($c), true);
    curl_multi_remove_handle($mh, $c);
  }

  // all done
  curl_multi_close($mh);

  return $result;
}

$data = array(
  'https://owapi.net/api/v2/u/'.$battletag.'/stats/'.$mode.'?platform='.$platform,
  'https://api.lootbox.eu/'.$platform.'/us/'.$battletag.'/profile',
  'https://api.lootbox.eu/'.$platform.'/us/'.$battletag.'/competitive-play/heroes'
);
$r = multiRequest($data);
这是可行的,我只需要在get_contents方法上添加json_decode方法


再次感谢大家。非常感谢您的帮助。

也许这本身并不是提高连接速度的方法,但您是否考虑过缓存?(考虑到缓存是一种可行的可能性)。话虽如此,您对此无能为力,这主要取决于您获得的数据量(如文字量,越少越好)以及相关API的速度。@Andrew我没有,这实际上是个好主意。这是一种可能性,我只需要为用户添加一些缓存更新来更新他们的结果。我建议(它实际上是用C编写的,顾名思义,它的速度太快了,除非你在多台服务器上运行,否则这是个坏主意)。如果您运行在多台服务器上,并且需要保持同步,那么我想Memcache和其他服务器一样是一个不错的选择。事实上,我收回这一点,PHP Redis显然支持多台服务器。我只是为了一致性而添加这个,我怀疑它是否与手头的问题有关。要执行对API的并行/并发调用,可以使用
curl\u multi\u exec
。要以正确的方式使用它,请查看此