您好,欢迎访问一九零五行业门户网

并发CURL访问并通过REDIS来控制并发数

并发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来控制并发数的内容。
其它类似信息

推荐信息