並發CURL訪問並通過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; }
以上就是並發CURL訪問並通過REDIS來控制並發數的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!