一般在php进行请求url的时候,直接用 fopen 函数就可以搞定了,比如像这样:
$file=fopen("http://www.cnblogs.com","r") or exit("");
$ret=""; while (!feof($file)){
$ret=$ret.fgetc($file);
}
fclose($file); echo $ret;
当然,也可以直接用 socket 方式,自己定义好http头参数手动实现:
$host="www.cnblogs.com";
$port=80; $content="GET / HTTP/1.1\r\n".
"Accept: */*\r\n".
"Connection: Keep-Alive\r\n".
"Host: $host"; $fp = fsockopen($host, $port, $errno, $errstr, 30);
if ($fp) {
fwrite($fp, $content);
while (!feof($fp)) {
$ret.=fgets($fp, 128);
}
fclose($fp);
}
echo $ret;
但这些请求方式都是阻塞的,如果需要同时进行多请求的话,就得借助于curl了。
其实php下可以有两种方式使用curl,一种是直接用exec函数调用命令式的curl,这个没什么多说的,跟直接命令使用没什么区别,只是被放在php里调用了而已。
php自己也对 curl 进行了包装,这里我们需要使用到 curl_multi_ 的一些方法实现:
function curl_multi_request ($query_arr) {
$ch = curl_multi_init();
$count = count($query_arr);
$ch_arr = array();
for ($i = 0; $i < $count; $i++) {
$query_string = $query_arr[$i];
$ch_arr[$i] = curl_init($query_string);
curl_setopt($ch_arr[$i], CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($ch, $ch_arr[$i]);
}
$running = null;
do {
curl_multi_exec($ch, $running);
} while ($running > 0);
for ($i = 0; $i < $count; $i++) {
$results[$i] = curl_multi_getcontent($ch_arr[$i]);
curl_multi_remove_handle($ch, $ch_arr[$i]);
}
curl_multi_close($ch);
return $results;
}
核心就是循环地调用 curl_multi_exec 方法来并发地进行url请求即可。
谢谢。