cURL特性之批處理
阿新 • • 發佈:2019-01-07
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並不是多執行緒,它屬於非同步處理的範疇。