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


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;
                $http_code = curl_getinfo($handle[$k],CURLINFO_HTTP_CODE); //獲取http錯誤碼
                $curl_error = curl_error($handle[$k]); //獲取curl錯誤碼
                //移除curl批處理句柄資源中的某個句柄資源,curl_multi_remove_handle()函數有兩個參數,第一個參數表示一個curl批處理句柄資源,第二個參數表示一個單獨的curl句柄資源。
                curl_multi_remove_handle($mh,$handle[$k]);
            }
            curl_multi_close($mh);
        }
    }

    return $result;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM