1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
| $arr[0]['total']['pcount']=$arr[0]['total']['pcount']>10?10:$arr[0]['total']['pcount'];
for ($i=2;$i<=$arr[0]['total']['pcount'];$i++){
//带上COOKIE文件,访问
$send_url='http://******.cn/ashx/GetList.ashx?pageIndex='.$i.'&keys='.htmlspecialchars($tj).'&Lx=3';
$ch = curl_init($send_url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//curl_setopt($ch, CURLOPT_COOKIEFILE, $COOKIE_file);
curl_setopt($ch, CURLOPT_COOKIE, $COOKIE);
$contents[] = curl_exec($ch);
curl_close($ch);
}
$arr=array();
foreach($contents as $k=>$v){
$arr[$k]=(json_decode($v,true));
}
}
//这个是调用curl_multi的
if($arr[0]['total']['pcount']>1){
$chArr=[];
for($i=2;$i<=$arr[0]['total']['pcount'];$i++){
$chArr[$i] = "http://*****.cn/ashx/GetList.ashx?pageIndex=$i&keys=".htmlspecialchars($tj)."&Lx=3";
}
$result = $this->postMulti($chArr,$COOKIE);
$arr = array_merge($arr,$result);
}
//这个是curl_multi
public static function postMulti($chArr,$COOKIE)
{
$max_request = count($chArr);
$ch_list = array();
$multi_ch = curl_multi_init();
for ($i = 2;$i <= $max_request+1;$i++) {
$ch_list[$i] = curl_init($chArr[$i]);
curl_setopt($ch_list[$i], CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch_list[$i], CURLOPT_COOKIE,$COOKIE) ; //如果注释此行返回结果则很快
curl_setopt($ch_list[$i], CURLOPT_TIMEOUT, 30);
//curl_setopt($ch_list[$i], CURLOPT_COOKIEFILE, $COOKIE_file);
curl_multi_add_handle($multi_ch, $ch_list[$i]);
}
$active = null;
do {
$mrc = curl_multi_exec($multi_ch, $active); //处理在栈中的每一个句柄。无论该句柄需要读取或写入数据都可调用此方法。
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
//Note:
//该函数仅返回关于整个批处理栈相关的错误。即使返回 CURLM_OK 时单个传输仍可能有问题。
while ($active && $mrc == CURLM_OK) {
if (curl_multi_select($multi_ch) != -1) {
//阻塞直到cURL批处理连接中有活动连接。
do {
$mrc = curl_multi_exec($multi_ch, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
//获取http返回的结果
$true_request = 0;
foreach ($ch_list as $k => $ch) {
$result[] = curl_multi_getcontent($ch);
curl_multi_remove_handle($multi_ch,$ch);
curl_close($ch);
if ($result == 1) {
$true_request += 1;
}
}
curl_multi_close($multi_ch);
foreach($result as $k=>$v){
$arr[$k]=(json_decode($v,true));
}
return $arr;
} |