//==============批量获取远程数据(
function async_get_url($url_array, $wait_usec = 0, $pCookie = "") {
if (!is_array($url_array)) {
return false;
}
$wait_usec = intval($wait_usec); $data = array();
$handle = array();
$mh = curl_multi_init(); $i = 0;
foreach ($url_array as $url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_TIMEOUT, 50);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)");
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
curl_setopt($ch, CURLOPT_MAXREDIRS, 7);
curl_setopt($ch, CURLOPT_REFERER, $url);
curl_setopt($ch, CURLOPT_ENCODING, "gzip");
if ($pCookie != "") {
curl_setopt($ch, CURLOPT_COOKIEFILE, $pCookie); // 读取上面所储存的Cookie信息
}
curl_multi_add_handle($mh, $ch); // 把 curl resource 放进 multi curl handler 里
$handle[$i++] = $ch;
}
do {
$mrc = curl_multi_exec($mh, $active);
if ($wait_usec > 0)
usleep($wait_usec);
}while ($mrc == CURLM_CALL_MULTI_PERFORM); while ($active and $mrc == CURLM_OK) {
if (curl_multi_select($mh) != -1) {
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
} foreach ($handle as $i => $ch) {
$content = curl_multi_getcontent($ch); $data[0][$i] = (curl_errno($ch) == 0) ? TranscodingStr($content) : false;
$data[1][$i] = (curl_errno($ch) == 0) ? $url_array[$i] : false; $content = NULL;
curl_close($ch);
curl_multi_remove_handle($mh, $ch);
}
curl_multi_close($mh); return $data;
}
我用这个函数同时获取100个网页的源文件,但是每次成功得到源文件的数量不稳定,有时候能得到100个有时候只能获取到60个左右,curl_error得不到错误剩余那些没有成功获取到的url经过我的测试 curl_multi_getcontent 获取到的为空.这是什么问题,为什么会返回空,也得不到错误,50个以内很少会出现问题我希望能知道具体原因,并且能有解决方法这个问题已经折磨我好几天了,一直得不到解决,我希望你们能够帮助我
function async_get_url($url_array, $wait_usec = 0, $pCookie = "") {
if (!is_array($url_array)) {
return false;
}
$wait_usec = intval($wait_usec); $data = array();
$handle = array();
$mh = curl_multi_init(); $i = 0;
foreach ($url_array as $url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_TIMEOUT, 50);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)");
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
curl_setopt($ch, CURLOPT_MAXREDIRS, 7);
curl_setopt($ch, CURLOPT_REFERER, $url);
curl_setopt($ch, CURLOPT_ENCODING, "gzip");
if ($pCookie != "") {
curl_setopt($ch, CURLOPT_COOKIEFILE, $pCookie); // 读取上面所储存的Cookie信息
}
curl_multi_add_handle($mh, $ch); // 把 curl resource 放进 multi curl handler 里
$handle[$i++] = $ch;
}
do {
$mrc = curl_multi_exec($mh, $active);
if ($wait_usec > 0)
usleep($wait_usec);
}while ($mrc == CURLM_CALL_MULTI_PERFORM); while ($active and $mrc == CURLM_OK) {
if (curl_multi_select($mh) != -1) {
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
} foreach ($handle as $i => $ch) {
$content = curl_multi_getcontent($ch); $data[0][$i] = (curl_errno($ch) == 0) ? TranscodingStr($content) : false;
$data[1][$i] = (curl_errno($ch) == 0) ? $url_array[$i] : false; $content = NULL;
curl_close($ch);
curl_multi_remove_handle($mh, $ch);
}
curl_multi_close($mh); return $data;
}
我用这个函数同时获取100个网页的源文件,但是每次成功得到源文件的数量不稳定,有时候能得到100个有时候只能获取到60个左右,curl_error得不到错误剩余那些没有成功获取到的url经过我的测试 curl_multi_getcontent 获取到的为空.这是什么问题,为什么会返回空,也得不到错误,50个以内很少会出现问题我希望能知道具体原因,并且能有解决方法这个问题已经折磨我好几天了,一直得不到解决,我希望你们能够帮助我
不是PHP与CURL的命令或函数我用了类似你的另一个版本的async_get_url
我并发十条线路去连不同的资料库的资料表运算,
在我的个人电脑XP Appserv里面很正常, 但放到公司正式Linux主机上,
发现返回的资料时有时无, 没有一次10个资料库都全的, 很不稳定,
CURLOPT_CONNECTTIMEOUT, 20 与 CURLOPT_TIMEOUT, 30
跟这个时间限制也无关... 上网看了下
详细因素有很多可能
可能主机附载能力太差 无法负荷太多连线数
可能伺服器网路频宽不足或网路设备不稳封包遗失不过LINUX主机应该比个人电脑强吧.. 所以尚不知道造成的原因
可以看我写的这个, 如果这不算挖坟的话.注意结束处理的while条件, 经过测试, 每次都可以取得1000条返回信息. 没丢失过.