1. 程式人生 > >cURL特性之批處理

cURL特性之批處理

cURL批處理

cURL還有一個高階特性——批處理控制代碼(handle)。這一特性允許同時或非同步開啟多了cURL連線。

【示例】:

<span style="font-family:FangSong_GB2312;font-size:18px;"><?PHP
      //建立兩個cURL資源
      $ch1 = curl_init();
      $ch2 = curl_init();
      //指定URL和適當的引數
      curl_setopt($ch1,CURLOPT_URL,"http://lxr.php.net/");
      curl_setopt($ch1,CURLOPT_HEADER,0);
      curl_setopt($ch2,CURLOPT_URL,"http://www.php.net/");
      curl_setopt($ch2,CURLOPT_HEADER,0);
      //建立cURL批處理控制代碼
      $mh = curl_multi_init();
      //加上前面兩個資源的控制代碼
      curl_multi_add_handle($mh,$ch1);
      curl_multi_add_handle($mh,$ch2);
      //預定義一個狀態變數
      $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);
           }
      }
      //關閉各個控制代碼
      curl_multi_remove_handle($mh,$ch1);
      curl_multi_remove_handle($mh,$ch2);
      curl_multi_close($mh);
?></span>


【解析】:

這裡要做的就是開啟多個cURL控制代碼並指派給一個批處理控制代碼,然後只需在一個while迴圈裡等待它執行完畢。

第一個do …while迴圈重複呼叫curl_multi_exec()。這個函式是無隔斷的。但會盡可能少的執行。它會返回一個狀態值,只要這個值等於常量CURM_CALL_MULTI_PERFORM,就代表還有一些刻不容緩的工作要做。(例如把對應的URL的HTTP頭資訊傳送出去),也就是說,需要不斷呼叫該函式,直到返回值發生改變。

接下來的while迴圈,只有在$active變數為true的時候繼續這一變數之前作為第二個引數傳給了curl_multi_exec(),代表只要批處理控制代碼中是否還有活動連線。接著呼叫curl_multi_select(),在活動連接出現之前,它都是被遮蔽的。這個函式成功之後,又會進入另一個do…while迴圈,繼續下一條URL。

【說明】:

很多人把這種方式稱為cURL多執行緒處理,而curl_multi_exec並不是多執行緒,它屬於非同步處理的範疇。