PHP自身沒有多線程的,可以借助擴展實現。但是curl_multi* 函數實現了多線程訪問網站數據的功能。
步驟總結如下:
第一步:調用curl_multi_init
第二步:循環調用curl_multi_add_handle
這一步需要注意的是,curl_multi_add_handle的第二個參數是由curl_init而來的子handle。
第三步:持續調用curl_multi_exec
第四步:根據需要循環調用curl_multi_getcontent獲取結果
第五步:調用curl_multi_remove_handle,并為每個字handle調用curl_close
第六步:調用curl_multi_close
- <?php
- $t=getTime();
- $total=10;
- for($i=0;$i<$total;$i++){
- $url_arr[] = "http://m.survivalescaperooms.com /test";
- }
- $mh = curl_multi_init();
- foreach ($url_arr as $i => $url) {
- $conn[$i] = curl_init($url);
- curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,1); // 設置返回頁面輸出內容
- curl_multi_add_handle ($mh,$conn[$i]); // 添加線程
- }
- #----------------執行線程----------------
- do {
- $mrc = curl_multi_exec($mh,$active);
- }while ($mrc == CURLM_CALL_MULTI_PERFORM);
- 2
- 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);
- }
- }
- 3
- foreach ($url_arr as $i => $url) {
- $res[$i]=curl_multi_getcontent($conn[$i]);//得到頁面輸入內容
- curl_multi_remove_handle($mh, $conn[$i]);
- curl_close($conn[$i]);
- }
- curl_multi_close($mh);
- 4
- foreach($res as $k=>$v){
- $k=str_pad($k,2,0);
- echo "$k => $v <br>";
- }
- 5
- runTime($t);
- #----------- calculate time function-------------
- function getTime(){
- $TIME=explode(" ",microtime());
- $TIME=$TIME[1].substr($TIME[0],1);
- return $TIME;
- }
- function runTime($t,$l=3){
- $dif=getTime()-$t;
- echo ' '.number_format($dif,$l);
- }
- ?>
新聞熱點
疑難解答