1. 程式人生 > >curl實現多路並發請求(請求數量大時再次分割實現循環處理)

curl實現多路並發請求(請求數量大時再次分割實現循環處理)

ret move data || timeout hand foreach 初始 nsf

function multiple_threads_request($data,$url,$chuck_num=20,$wait_usec = 0){
    $result = [];
    if (empty($data) || empty($url)) {
        $send_data = array_chunk($data, $chuck_num,true);
        foreach ($send_data as $son_data){
            $mh = curl_multi_init(); //初始化一個curl批處理句柄資源
            $handle
= []; foreach ($son_data as $k=>$val) { $curl_array[$k] = curl_init($url); curl_setopt($handle[$k], CURLOPT_RETURNTRANSFER, 1); curl_setopt($handle[$k], CURLOPT_SSL_VERIFYPEER, false); curl_setopt($handle[$k], CURLOPT_SSL_VERIFYHOST, false
); curl_setopt($handle[$k], CURLOPT_POST, 1); curl_setopt($handle[$k], CURLOPT_TIMEOUT,10); curl_setopt($handle[$k], CURLOPT_HEADER, 0); curl_setopt($handle[$k], CURLOPT_POSTFIELDS,$val); //向curl批處理句柄資源中添加單獨的curl句柄資源。curl_multi_add_handle函數有兩個參數,第一個參數表示一個curl批處理句柄資源,第二個參數表示一個單獨的curl句柄資源
curl_multi_add_handle($mh, $handle[$k]); } $running = 0; do { //解析一個curl批處理句柄,curl_multi_exec函數有兩個參數,第一個表示一個批處理句柄資源,第二個參數是一個應用值參數,表示剩余需要處理的單個的curl句柄資源。 curl_multi_exec($mh, $running);//持續調用curl_multi_exec if ($wait_usec > 0) /* 每個 connect 要間隔多久 */ usleep($wait_usec); // 250000 = 0.25 sec } while ($running > 0); foreach ($son_data as $k=>$val) { $return = curl_multi_getcontent($handle[$k]);//根據需要循環調用curl_multi_getcontent $return[$k] = (curl_errno($handle[$k]) == 0) ? $return : false; //移除curl批處理句柄資源中的某個句柄資源,curl_multi_remove_handle()函數有兩個參數,第一個參數表示一個curl批處理句柄資源,第二個參數表示一個單獨的curl句柄資源。 curl_multi_remove_handle($mh,$handle[$k]); } curl_multi_close($mh); } } return $result; }

curl實現多路並發請求(請求數量大時再次分割實現循環處理)