一般在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請求即可。
謝謝。