php併發請求

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

謝謝。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章