1. 文章熱詞:php,curl并發

          日期:2019-06-11 09:04 by 楊國偉 1221 0 收藏
          我要分享

          摘要:在我們平時的程序中有時候會出現同時訪問幾個接口的情況,我們都是用curl進行訪問,而這種訪問一般都是單個、順序訪問的。那麽問題來咯,假如有3個接口,每個接口耗時500毫秒,這樣三個接口就要花費1500毫秒了,這個問題很嚴重,嚴重影響了頁面訪問速度。

          解決問題

          有沒有可能并發訪問來提高速度呢?今天就簡單的說一下,利用 curl并發來提高頁面訪問速度

          看看單個,順序curl訪問方式以及耗時統計

          <?php
          function curl_fetch($url, $timeout=3){
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            $data = curl_exec($ch);
            $errno = curl_errno($ch);
            if ($errno>0) {
              $data = false;
            }
            curl_close($ch);
            return $data;
          }
          function microtime_float(){
            list($usec, $sec) = explode(" ", microtime());
            return ((float)$usec + (float)$sec);
          }
          $url_arr=array(
             "taobao"=>"http://www.taobao.com",
             "sohu"=>"http://www.sohu.com",
             "sina"=>"http://www.sina.com.cn",
             );
           $time_start = microtime_float();
           $data=array();
           foreach ($url_arr as $key=>$val)
           {
             $data[$key]=curl_fetch($val);
           }
           $time_end = microtime_float();
           $time = $time_end - $time_start;
           echo "耗時:{$time}";
          ?>

          以上代碼運行結果如下:耗時:0.614秒  顯然這是不可取的。來看看并發的效果

          curl并發訪問方式以及耗時統計

          <?php
          function curl_multi_fetch($urlarr=array()){
            $result=$res=$ch=array();
            $nch = 0;
            $mh = curl_multi_init();
            foreach ($urlarr as $nk => $url) {
              $timeout=2;
              $ch[$nch] = curl_init();
              curl_setopt_array($ch[$nch], array(
              CURLOPT_URL => $url,
              CURLOPT_HEADER => false,
              CURLOPT_RETURNTRANSFER => true,
              CURLOPT_TIMEOUT => $timeout,
              ));
              curl_multi_add_handle($mh, $ch[$nch]);
              ++$nch;
            }
            /* wait for performing request */
            do {
              $mrc = curl_multi_exec($mh, $running);
            } while (CURLM_CALL_MULTI_PERFORM == $mrc);
            while ($running && $mrc == CURLM_OK) {
              // wait for network
              if (curl_multi_select($mh, 0.5) > -1) {
                // pull in new data;
                do {
                  $mrc = curl_multi_exec($mh, $running);
                } while (CURLM_CALL_MULTI_PERFORM == $mrc);
              }
            }
            if ($mrc != CURLM_OK) {
              error_log("CURL Data Error");
            }
            /* get data */
            $nch = 0;
            foreach ($urlarr as $moudle=>$node) {
              if (($err = curl_error($ch[$nch])) == ) {
                $res[$nch]=curl_multi_getcontent($ch[$nch]);
                $result[$moudle]=$res[$nch];
              }else{
                error_log("curl error");
              }
              curl_multi_remove_handle($mh,$ch[$nch]);
              curl_close($ch[$nch]);
              ++$nch;
            }
            curl_multi_close($mh);
            return $result;
          }
          $url_arr=array(
             "taobao"=>"http://www.taobao.com",
             "sohu"=>"http://www.sohu.com",
             "sina"=>"http://www.sina.com.cn",
             );
          function microtime_float(){
            list($usec, $sec) = explode(" ", microtime());
            return ((float)$usec + (float)$sec);
          }
          $time_start = microtime_float();
          $data=curl_multi_fetch($url_arr);
          $time_end = microtime_float();
          $time = $time_end - $time_start;
          echo "耗時:{$time}";
          ?>

          運行後的結果:耗時:0.316秒  很明顯,時間減少了一半

          上面是一個例子,我們在開發中對接接口的時候經常會遇到,所以在關于php性能方面,這類問題還是要引起關注的!

          上一篇:塗磊-明明是你無能,卻總怪我拜金

          下一篇:php實現地址自動識别


          評論