亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

PHP模擬發送POST請求之五curl基本使用和多線程優化

2020-03-22 17:44:15
字體:
來源:轉載
供稿:網友
  • 今天來介紹PHP模擬發送POST請求的重型武器——cURL函數庫的使用和其多線程的優化方法。

    說起cURL函數,可謂是老生常談,但網上許多資料都在關鍵部分語焉不詳,列出一大堆手冊上的東西,搞得我入門時也萬分痛苦,我翻了些資料,結合自己的筆記,總結了這篇博文,希望能給初次接觸cURL的開發者提供一些幫助。


    cURL的基本使用步驟

    首先來介紹cURL:

    cURL按照HTTP頭信息來模擬瀏覽器傳輸數據,它支持FTP,FTPS,HTTP,HTTPS,DICT,FILE等協議,擁有HTTPS認證,HTTPPOST方法,HTTPPUT方法,FTP上傳,HTTP上傳,代理服務器,cookies,用戶名/密碼認證等功能。cURL可謂是實現爬站抓取網頁、POST數據等功能的利器。

    使用cURL函數主要分為四部分:

    1.初始化cURL。

    2.設置cURL變量,這是cRUL的核心,擴展功能全靠這一步驟。

    3.執行cURL,獲取結果。

    4.關閉連接,回收資源。

    $ch = curl_init();//1curl_setopt($ch, CURLOPT_URL, 'http://localhost');//2$output = curl_exec($ch);//3curl_close($ch);//4

    另外,我們還可以使用curl_getinfo($ch)函數獲取curl執行的信息,其結果為一個數組

    $info數組的內容包括如下等內容:

    “url”//資源網絡地址 “content_type”//內容編碼 “http_code”//HTTP狀態碼 “filetime”//文件創建時間 “total_time”//總耗時 “size_upload”//上傳數據的大小 “size_download”//下載數據的大小 “speed_download”//下載速度 “speed_upload”//上傳速度 “download_content_length”//下載內容的長度 “upload_content_length”//上傳內容的長度

    cURL的常用設置

    下面詳細介紹curl使用第二步時常用的變量設置,在使用curl函數時,可以按各種需求來設置。

    設置基本信息:

    curl_setopt($ch,CURLOPT_URL,$string);//設置curl的目錄地址

    curl_setopt($ch,CURLOPT_PORT,$port);//設置連接端口,一般不設置默認80

    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);//返回結果流,并不是輸出它留待后續處理,一般會設置這一項,稍后處理抓取到的信息,而不是直接輸出出來。

    設置POST數據信息:

    curl_setopt($ch,CURLOPT_POST,1);//設置傳送數據方式為POST

    curl_setopt($ch,CURLOPT_POSTFIELDS,$string);//設置要傳輸的數據

    設置驗證信息:

    curl_setopt($ch,CURLOPT_COOKIE,$string);//設置curl執行時所攜帶的html' target='_blank'>Cookie信息

    curl_setopt($ch,CURLOPT_USERAGENT,$string);//設置curl模擬的瀏覽器信息

    curl_setopt($ch,CURLOPT_REFERER,$string);//設置header中的referer,有利于破解防盜鏈

    curl_setopt($ch,CURLOPT_USERPWD,$string);//傳遞一個連接中需要的用戶名和密碼,格式為:'[username]:[password]'

    curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);//設置允許服務器重定向

    設置強化信息:

    curl_setopt($ch,CURLOPT_NOBODY,1);//設置不允許輸出HTMLbody體,如果在抓取頁面標題等信息時設置此選項會大大加快速度

    curl_setopt($ch,CURLOPT_TIMEOUT,$int);//設置允許執行的最長秒數(超時時間),設置數值小的時候,CURL會放棄執行時間長的頁面

    curl_setopt($ch,CURLOPT_HEADER,1);//設置允許將讀取目標時產生的header頭文件包含在輸出流中


    cURL批處理功能的基本使用

    當然cURL的功能并不止于此,在手冊上你可以找到它更多的變量設置。而且cURL最強大的地方在其批處理功能。

    cURL的批處理似乎也很好理解,以下是一般步驟:

    1.$mh=curl_multi_init();//初始化一個批處理句柄。

    2.curl_multi_add_handle($mh,$ch);//往批處理句柄中添加設置好的$ch句柄。

    3.curl_multi_exec($mh,$running);//執行$mh句柄,并將$mh句柄的運行狀態寫入$running變量中

    4.當$running為true時循環執行curl_multi_close()函數

    5.循環結束后遍歷$mh句柄,用curl_multi_getcontent()獲取第一個句柄的返回值

    6.用curl_multi_remove_handle()將$mh中的句柄移除

    7.用curl_multi_close()關閉$mh批處理句柄。

    代碼如下:

     <?php         $chArr=[];        for($i=0;$i<50;$i++){              $chArr[$i]=curl_init('http://www.baidu.com');              curl_setopt($chArr[$i],CURLOPT_RETURNTRANSFER,1);        }       $mh = curl_multi_init(); //1       foreach($chArr as $k => $ch){               curl_multi_add_handle($mh,$ch); //2        }       $running = null;        do{            curl_multi_exec($mh,$running); //3        }while($running > 0); //4        foreach($chArr as $k => $ch){               $result[$k]= curl_multi_getcontent($ch); //5              curl_multi_remove_handle($mh,$ch);//6        }        curl_multi_close($mh); //7      ?>    

    cURL批處理時內存占用過多的問題

    但是,執行大批量的句柄時我們會發現一個很嚴重的問題,那就是執行時系統CPU占用率幾乎100%,幾乎是死機狀態了。糾其原因,那是因為在$running>0,執行curl_multi_exec($mh,$running)而整個批處理句柄沒有全部執行完畢時,系統會不停地執行curl_multi_exec()函數。我們用實驗來證明:

    我們在循環中curl_multi_exec($mh,$running)句前加入一個echo'a';的語句。我們的目的是執行50次對百度的訪問,然后來看一下結果。

    從圖中滾動條的大小(滾動條已經最小狀態了)可以大概看出輸出a的個數,500個也不止,所以我們便可以找到占用CPU的罪魁禍首了。


    cURL批處理時的內存優化方案

    進行改動的方式是應用curl函數庫中的curl_multi_select()函數,其函數原型如下:

    intcurl_multi_select(resource$mh[,float$timeout=1.0])

    阻塞直到cURL批處理連接中有活動連接。成功時返回描述符集合中描述符的數量。失敗時,select失敗時返回-1,否則返回超時(從底層的select系統調用)。

    我用們curl_multi_select()函數來達到沒有需要讀取的程序就阻塞住的目的。

    我們對批處理的第3、4步進行優化,利用其多線程,模擬并發程序。

    很多朋友會對手冊中提供的代碼心存疑惑(我一開始也是),下面的代碼及解釋。

    $running = null;do {    $mrc = curl_multi_exec($mh, $running);} while ($mrc == CURLM_CALL_MULTI_PERFORM);//本次循環第一次處理$mh批處理中的$ch句柄,并將$mh批處理的執行狀態寫入$running,當狀態值等于CURLM_CALL_MULTI_PERFORM時,表明數據還在寫入或讀取中,執行循環,當第一次$ch句柄的數據寫入或讀取成功后,狀態值變為CURLM_OK,跳出本次循環,進入下面的大循環之中。//$running為true,即$mh批處理之中還有$ch句柄正待處理,$mrc==CURLM_OK,即上一次$ch句柄的讀取或寫入已經執行完畢。while ($running && $mrc == CURLM_OK) {     if (curl_multi_select($mh) != -1) {//$mh批處理中還有可執行的$ch句柄,curl_multi_select($mh) != -1程序退出阻塞狀態。        do {                            //繼續執行需要處理的$ch句柄。             $mrc = curl_multi_exec($mh, $running);        } while ($mrc == CURLM_CALL_MULTI_PERFORM);    }}

    這樣執行的好處是$mh批處理中的$ch句柄會在讀取或寫入數據結束后($mrc==CURLM_OK),進入curl_multi_select($mh)的阻塞階段,而不會在整個$mh批處理執行時不停地執行curl_multi_exec,白白浪費CPU資源。


    cURL批處理的內存優化結果

    完整代碼如下:

    <?php         $chArr=[];        for($i=0;$i<50;$i++){        $chArr[$i]=curl_init('http://www.baidu.com');        curl_setopt($chArr[$i],CURLOPT_RETURNTRANSFER,1);        }       $mh = curl_multi_init();         foreach($chArr as $k => $ch)              curl_multi_add_handle($mh,$ch);         $running = null;         do {        $mrc = curl_multi_exec($mh, $running);     } while ($mrc == CURLM_CALL_MULTI_PERFORM);    while ($running && $mrc == CURLM_OK) {         if (curl_multi_select($mh) != -1) {             do {                  $mrc = curl_multi_exec($mh, $running);             } while ($mrc == CURLM_CALL_MULTI_PERFORM);         }    }       foreach($chArr as $k => $ch){                $result[$k]= curl_multi_getcontent($ch);                curl_multi_remove_handle($mh,$ch);       }        curl_multi_close($mh);       ?>

    我們再次在$mrc=curl_multi_exec($mh,$running)句子前加入echo'a';結果如下圖:

    雖然也不止50次,但是比之未優化前,CPU使用率已經大為改觀。

    雖然curl函數非常強大,但是我們還是有使用其他函數來發送POST請求的機會,另外也能從更底層了解curl函數,所以本輯也用大很大篇幅在其他函數上。

    OK,本輯結束,寫這輯博文的同時,我也學習到了很多。如果您覺得本博文對您有幫助,請您點推薦或關注我,我們繼續分享我的筆記總結。如果有什么問題,您可以在下方留言討論,謝謝閱讀。

    PHP編程

    鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

  • 發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
    91极品视频在线| 欧美日韩国产综合视频在线观看中文| 亚洲综合在线播放| 日本精品一区二区三区在线| 欧美中文字幕在线播放| 美乳少妇欧美精品| 久久天天躁狠狠躁夜夜躁2014| 性欧美暴力猛交69hd| 欧美影院成年免费版| 丝袜美腿亚洲一区二区| 91精品国产99久久久久久| 精品视频在线导航| 国模精品视频一区二区| 国产精品av免费在线观看| 欧美视频免费在线观看| 国产精品久久久av久久久| 国产精品视频99| 亚洲永久在线观看| 91精品国产91久久久| 日韩日本欧美亚洲| 在线日韩欧美视频| 国产精品极品美女在线观看免费| 欧美多人乱p欧美4p久久| 日韩精品中文字| 亚洲欧洲日韩国产| 国产情人节一区| 国产精品三级在线| 国产欧美在线播放| 6080yy精品一区二区三区| 欧美理论电影在线播放| 热re91久久精品国99热蜜臀| 九九视频这里只有精品| 精品伊人久久97| 久久亚洲精品视频| 精品国产美女在线| 亚洲aⅴ日韩av电影在线观看| 国产视频欧美视频| 97成人精品视频在线观看| 久久国产精品久久精品| 国产日韩欧美视频在线| 91精品国产综合久久香蕉| 亚洲国产精品久久精品怡红院| 国产亚洲一区二区在线| 成人在线国产精品| 欧美成人免费小视频| 国产精品久久久久久五月尺| 91免费电影网站| 精品亚洲国产视频| 欧美精品情趣视频| 亚洲国产成人精品久久久国产成人一区| 亚洲一区二区三区在线免费观看| 7777精品视频| 97国产成人精品视频| 久久精品欧美视频| 福利精品视频在线| 亚洲精品在线看| 青青草原一区二区| 97在线视频观看| 久久天堂电影网| 91久久精品美女高潮| 黄色成人在线免费| 成人黄色激情网| 日韩专区中文字幕| 亲爱的老师9免费观看全集电视剧| 国产精品999| 国产精品成人品| 欧美丰满老妇厨房牲生活| 欧美视频第一页| 久久久影视精品| 国产在线精品成人一区二区三区| 国产精品久久久久久一区二区| 日韩电影第一页| 亚洲成人精品久久久| 欧美性高潮在线| 亚洲精品在线看| 成人激情免费在线| 欧美午夜xxx| 亚洲精品456在线播放狼人| 在线视频欧美性高潮| 国产日韩亚洲欧美| 久久国产精品久久久久久| 国产精品高清在线| 欧美激情小视频| 亚洲mm色国产网站| 精品久久久在线观看| 日韩欧美亚洲国产一区| 91久久国产综合久久91精品网站| 久久视频免费在线播放| 成人免费直播live| 成人a视频在线观看| 2020欧美日韩在线视频| 国产精品国产三级国产专播精品人| 亚洲开心激情网| 亚洲国产精品va在线看黑人动漫| 国产亚洲在线播放| 91色琪琪电影亚洲精品久久| 亚洲国产福利在线| 欧美一区二区三区精品电影| 日韩在线观看免费网站| 国产日韩中文字幕| 美日韩精品视频免费看| 精品在线欧美视频| 国产有码在线一区二区视频| 亚洲欧美制服另类日韩| 欧美日韩成人黄色| 亚洲第一页中文字幕| 日韩在线播放av| 欧美精品精品精品精品免费| 亚洲成av人乱码色午夜| 国内精品一区二区三区| 黑人巨大精品欧美一区二区| 黄色一区二区三区| 亚洲欧美激情四射在线日| 亚洲桃花岛网站| 国产成人精品免费视频| 伊人一区二区三区久久精品| 精品精品国产国产自在线| 亚洲精品资源在线| 亚洲欧美日韩久久久久久| 亚洲永久在线观看| 亚洲一级一级97网| 久久亚洲国产精品| 欧美综合在线观看| 久久精品亚洲国产| 4438全国成人免费| 欧美激情亚洲国产| 成人女保姆的销魂服务| 精品久久国产精品| 日韩高清电影好看的电视剧电影| 亚洲精品wwww| 亚洲乱码一区av黑人高潮| 777国产偷窥盗摄精品视频| 国产精品美腿一区在线看| 亚洲精品自在久久| 日本成人激情视频| 91美女福利视频高清| 一本色道久久综合狠狠躁篇的优点| 91在线免费网站| 亚洲国产精品久久久久久| 欧美黄色片在线观看| 综合欧美国产视频二区| 国产精品一区二区av影院萌芽| 亚洲精品一区二区网址| 欧美激情视频播放| 国产一区二区三区在线免费观看| 日本乱人伦a精品| 精品福利在线视频| 亚洲石原莉奈一区二区在线观看| 国产成人精品免高潮费视频| 欧美丝袜第一区| 中文国产亚洲喷潮| 成人黄色网免费| 亚洲精品国产综合区久久久久久久| 亚洲成人av中文字幕| 日韩精品极品视频| 欧美激情久久久久| 日韩电影免费观看在线观看| 亚洲第一区中文字幕| 97在线视频观看| 亚洲高清福利视频| 精品国产鲁一鲁一区二区张丽| 亚洲一区二区三区乱码aⅴ| 亚洲女人天堂成人av在线| 亚洲免费av网址|