zoukankan      html  css  js  c++  java
  • cURL: PHP并发处理方式

    function classic_curl($urls, $delay) { 
        $queue = curl_multi_init(); 
        $map = array(); 
      
        foreach ($urls as $url) { 
            // create cURL resources 
            $ch = curl_init(); 
      
            // set URL and other appropriate options 
            curl_setopt($ch, CURLOPT_URL, $url); 
      
            curl_setopt($ch, CURLOPT_TIMEOUT, 1); 
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
            curl_setopt($ch, CURLOPT_HEADER, 0); 
            curl_setopt($ch, CURLOPT_NOSIGNAL, true); 
      
            // add handle 
            curl_multi_add_handle($queue, $ch); 
            $map[$url] = $ch; 
        } 
      
        $active = null; 
      
        // execute the handles 
        do { 
            $mrc = curl_multi_exec($queue, $active); 
        } while ($mrc == CURLM_CALL_MULTI_PERFORM); 
      
        while ($active > 0 && $mrc == CURLM_OK) { 
            if (curl_multi_select($queue, 0.5) != -1) { 
                do { 
                    $mrc = curl_multi_exec($queue, $active); 
                } while ($mrc == CURLM_CALL_MULTI_PERFORM); 
            } 
        } 
      
        $responses = array(); 
        foreach ($map as $url=>$ch) { 
            $responses[$url] = callback(curl_multi_getcontent($ch), $delay); 
            curl_multi_remove_handle($queue, $ch); 
            curl_close($ch); 
        } 
      
        curl_multi_close($queue); 
        return $responses; 
    }


    function rolling_curl($urls, $delay) { 
        $queue = curl_multi_init(); 
        $map = array(); 
      
        foreach ($urls as $url) { 
            $ch = curl_init(); 
      
            curl_setopt($ch, CURLOPT_URL, $url); 
            curl_setopt($ch, CURLOPT_TIMEOUT, 1); 
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
            curl_setopt($ch, CURLOPT_HEADER, 0); 
            curl_setopt($ch, CURLOPT_NOSIGNAL, true); 
      
            curl_multi_add_handle($queue, $ch); 
            $map[(string) $ch] = $url; 
        } 
      
        $responses = array(); 
        do { 
            while (($code = curl_multi_exec($queue, $active)) == CURLM_CALL_MULTI_PERFORM) ; 
      
            if ($code != CURLM_OK) { break; } 
      
            // a request was just completed -- find out which one 
            while ($done = curl_multi_info_read($queue)) { 
      
                // get the info and content returned on the request 
                $info = curl_getinfo($done['handle']); 
                $error = curl_error($done['handle']); 
                $results = callback(curl_multi_getcontent($done['handle']), $delay); 
                $responses[$map[(string) $done['handle']]] = compact('info', 'error', 'results'); 
      
                // remove the curl handle that just completed 
                curl_multi_remove_handle($queue, $done['handle']); 
                curl_close($done['handle']); 
            } 
      
            // Block for data in / output; error handling is done by curl_multi_exec 
            if ($active > 0) { 
                curl_multi_select($queue, 0.5); 
            } 
      
        } while ($active); 
      
        curl_multi_close($queue); 
        return $responses; 
    }
  • 相关阅读:
    Reporting Services系列三:几个细节
    Tips&Tricks系列一:更改VS2005设置
    Reporting Services系列二:引用.NET DLL
    数据库基础系列之六:因空间不足导致IMP失败
    .NET基础示例系列之十四:C#导出建表语句及数据
    Reporting Services系列四:折叠报表
    数据库基础系列之七:IMP数据到指定的表空间
    .NET基础示例系列之十六:制做进程监视器
    .NET基础示例系列之十九:Dundas For ASP.NET
    .NET基础示例系列之十五:操作Excel
  • 原文地址:https://www.cnblogs.com/hubing/p/3287253.html
Copyright © 2011-2022 走看看