Heim  >  Artikel  >  Backend-Entwicklung  >  Gleichzeitiger CURL-Zugriff und Kontrolle der Anzahl der Parallelitäten über REDIS

Gleichzeitiger CURL-Zugriff und Kontrolle der Anzahl der Parallelitäten über REDIS

PHP中文网
PHP中文网Original
2017-04-01 15:05:382262Durchsuche

Gleichzeitiger CURL-Zugriff und Steuerung der Anzahl der Parallelität über REDIS

// 队列redis连接操作
    public function RedisConnect() {
        $queue = 
Yii::app()->queue_redis;
        $server = $queue->host;
        $port = $queue->port;
        $timeout = $queue->timeOut;


  
      $redis =  new Redis();
        $redis->connect($server, $port, 
$timeout); // timeout=300
        return $redis;
    }

/**  redis计数控制并发
     *
     * @param       connomains: url数组
     * 
@param       key: redis键名
     * @param       max: 总运行次数
     * @param     
  ip:  ip
     * @param       c:   c当前循环次数
     * @param       i:   
并发控制,允许同时运行多少条
     * @return
     */
    private function 
redisCount(&$connomains,$key,$ip,$max,$c,$i=20){
        $RedisConnect = 
$this->RedisConnect();
        $redis = $RedisConnect->get($key);
  
      echo "redis==".$redis;
        if(isset($redis)){
            if($redis >= $i){
                if(!empty($connomains)){
            
        $this->multi_curl($connomains);
                    $connomains = 
array();
                }
                sleep(2);
                $this->redisCount($connomains,$key,$ip,$max,$c,$i); 
            }else{
                $RedisConnect->incr($key);
            }
    
    }
        
    }

//并发多线程访问
    private function multi_curl($links){
        $mh = 
curl_multi_init();
        $instances = array();
        foreach($links as 
$type=>$link){
            $instances[$type] = 
curl_init($link['url']);
            curl_setopt($instances[$type],CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($instances[$type],CURLOPT_TIMEOUT, 90);//原先90 2014/11/10
        
    curl_setopt($instances[$type],CURLOPT_POST, 1);
            curl_setopt($instances[$type],CURLOPT_POSTFIELDS, $link['data']);
            curl_multi_add_handle($mh,$instances[$type]);
        }
        
      
  // 
do{$n=curl_multi_exec($mh,$active);}while($active);//$active表示还有多少个连接要执行
    
    do {
            $mrc = curl_multi_exec($mh,$active);     
//curl_multi_exec运行结果0是成功,-1是有问题
        } while ($mrc == 
CURLM_CALL_MULTI_PERFORM);  //CURLM_CALL_MULTI_PERFORM常量,值-1
        while 
($active and $mrc == CURLM_OK) {       //CURLM_OK常量,值0
            if 
(curl_multi_select($mh) != -1) {      //curl_multi_select($mh) 
判断是否正在执行,未执行0,正在执行1,错误-1
                do {
                    $mrc = 
curl_multi_exec($mh, $active);    //$active表示还有多少个连接要执行
                } 
while ($mrc == CURLM_CALL_MULTI_PERFORM);
            }
        }
      
  
        foreach($links as $type=>$link){
            $res[$type] = 
curl_multi_getcontent($instances[$type]);
            curl_close($instances[$type]);
        }
        
        return 
$res;
    }

Das Obige ist der Inhalt des gleichzeitigen CURL-Zugriffs und der Steuerung der Anzahl der Parallelität über REDIS, mehr Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:PHP-Parsing-ProzessNächster Artikel:PHP-Parsing-Prozess