并发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来控制并发数的内容。