参考网址:http://www.onlineaspect.com/2009/01/26/how-to-use-curl_multi-without-blocking/
封装的很好
用起来很方便~
但是注意哦~这个里面有bug,还有一些html需要完善
封装的很好
用起来很方便~
但是注意哦~这个里面有bug,还有一些html需要完善
function
rolling_curl($urls,
$callback, $custom_options
= null) {
// make sure the
rolling window isn't greater than the # of urls
$rolling_window
= 5;
$rolling_window
=
(sizeof($urls)
<
$rolling_window) ?
sizeof($urls)
: $rolling_window;
$master
=
curl_multi_init();
$curl_arr
=
array();
// add additional curl
options here
$std_options
=
array(CURLOPT_RETURNTRANSFER
=>
true,
CURLOPT_FOLLOWLOCATION
=>
true,
CURLOPT_MAXREDIRS
=>
5);
$options
=
($custom_options) ?
($std_options +
$custom_options) :
$std_options;
// start the first
batch of requests
for
($i =
0; $i
<
$rolling_window;
$i++) {
$ch =
curl_init();
$options[CURLOPT_URL]
=
$urls[$i];
curl_setopt_array($ch,$options);
curl_multi_add_handle($master,
$ch);
}
do
{
while(($execrun
=
curl_multi_exec($master,
$running)) ==
CURLM_CALL_MULTI_PERFORM);
if($execrun !=
CURLM_OK)
break;
// a request was just completed -- find
out which one
while($done =
curl_multi_info_read($master))
{
$info =
curl_getinfo($done['handle']);
if
($info['http_code']
== 200)
{
$output
=
curl_multi_getcontent($done['handle']);
// request successful.
process output using the callback
function.
$callback($output);
//bug在这里,他会有一次空请求
// start a new request
(it's important to do this before removing the old
one)
$ch
=
curl_init();
$options[CURLOPT_URL]
=
$urls[$i++];
// increment i
curl_setopt_array($ch,$options);
curl_multi_add_handle($master,
$ch);
// remove the curl
handle that just completed
curl_multi_remove_handle($master,
$done['handle']);
} else {
// request failed.
add error handling.
}
}
}
while
($running);
curl_multi_close($master);
return
true;
}
//bug在这里,他会有一次空请求
}