dtdfl62844 2012-02-29 02:42
浏览 67
已采纳

如何使用PHP加载多个外部文件 - 快速?

Does anyone know what the best (or a really good) way is to load external files (about 10-20) from an api with performance in mind. Each session has different content. Currently I try "file_get_contents" but experience serious performance issues. I'm not really familiar with Curl but it seems performance wise to beat the good old PHP way. Any ideas/examples?

  • 写回答

2条回答 默认 最新

  • duanqiao1949 2012-02-29 03:04
    关注

    You could also use curl multi to grab multiple files at once, there is a tutorial here:

    http://www.phpied.com/simultaneuos-http-requests-in-php-with-curl/

    <?php
    //Copy & pasted from the above link
    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] = curl_multi_getcontent($c);
        curl_multi_remove_handle($mh, $c);
      }
      // all done
      curl_multi_close($mh);
      return $result;
    }
    ?>
    
    <?php
    $data = array(
      'http://search.yahooapis.com/VideoSearchService/V1/videoSearch?appid=YahooDemo&query=Pearl+Jam&output=json',
      'http://search.yahooapis.com/ImageSearchService/V1/imageSearch?appid=YahooDemo&query=Pearl+Jam&output=json',
      'http://search.yahooapis.com/AudioSearchService/V1/artistSearch?appid=YahooDemo&artist=Pearl+Jam&output=json'
    );
    $r = multiRequest($data);
    
    echo '<pre>';
    print_r($r);
    /*
    Array
    (
        [0] => {"ResultSet":{"totalResultsAvailable":"633","totalResultsReturned":...
        [1] => {"ResultSet":{"totalResultsAvailable":"105342","totalResultsReturned":...
        [2] => {"ResultSet":{"totalResultsAvailable":10,"totalResultsReturned":...
    )
    */
    ?>
    

    Or curl php docs http://www.php.net/manual/en/function.curl-multi-init.php

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看