国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - PHP教程 - 淺談PHP模擬發(fā)送POST請(qǐng)求之curl基本使用

淺談PHP模擬發(fā)送POST請(qǐng)求之curl基本使用

2021-11-16 15:50枕邊書(shū) PHP教程

今天來(lái)介紹PHP模擬發(fā)送POST請(qǐng)求的重型武器——cURL函數(shù)庫(kù)的使用和其多線程的優(yōu)化方法。說(shuō)起cURL函數(shù),可謂是老生常談,但網(wǎng)上許多資料都在關(guān)鍵部分語(yǔ)焉不詳,于是筆者翻了些資料,結(jié)合自己的筆記,總結(jié)了這篇文章,希望能給

cURL的基本使用步驟

首先來(lái)介紹cURL:

cURL按照HTTP頭信息來(lái)模擬瀏覽器傳輸數(shù)據(jù),它支持FTP,FTPS,HTTP,HTTPS,DICT,FILE等協(xié)議,擁有HTTPS認(rèn)證,HTTPPOST方法,HTTPPUT方法,F(xiàn)TP上傳,HTTP上傳,代理服務(wù)器,cookies,用戶名/密碼認(rèn)證等功能。cURL可謂是實(shí)現(xiàn)爬站抓取網(wǎng)頁(yè)、POST數(shù)據(jù)等功能的利器。

使用cURL函數(shù)主要分為四部分:

1.初始化cURL。

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

3.執(zhí)行cURL,獲取結(jié)果。

4.關(guān)閉連接,回收資源。

?
1
2
3
4
5
6
7
$ch = curl_init();//1
 
curl_setopt($ch, CURLOPT_URL, "http://localhost");//2
 
$output = curl_exec($ch);//3
 
curl_close($ch);//4

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

$info數(shù)組的內(nèi)容包括如下等內(nèi)容:

  • “url”//資源網(wǎng)絡(luò)地址
  • “content_type”//內(nèi)容編碼
  • “http_code”//HTTP狀態(tài)碼
  • “filetime”//文件創(chuàng)建時(shí)間
  • “total_time”//總耗時(shí)
  • “size_upload”//上傳數(shù)據(jù)的大小
  • “size_download”//下載數(shù)據(jù)的大小
  • “speed_download”//下載速度
  • “speed_upload”//上傳速度
  • “download_content_length”//下載內(nèi)容的長(zhǎng)度
  • “upload_content_length”//上傳內(nèi)容的長(zhǎng)度

cURL的常用設(shè)置

下面詳細(xì)介紹curl使用第二步時(shí)常用的變量設(shè)置,在使用curl函數(shù)時(shí),可以按各種需求來(lái)設(shè)置。

設(shè)置基本信息:

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

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

curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);//返回結(jié)果流,并不是輸出它留待后續(xù)處理,一般會(huì)設(shè)置這一項(xiàng),稍后處理抓取到的信息,而不是直接輸出出來(lái)。

設(shè)置POST數(shù)據(jù)信息:

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

curl_setopt($ch,CURLOPT_POSTFIELDS,$string);//設(shè)置要傳輸?shù)臄?shù)據(jù)

設(shè)置驗(yàn)證信息:

curl_setopt($ch,CURLOPT_COOKIE,$string);//設(shè)置curl執(zhí)行時(shí)所攜帶的Cookie信息

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

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

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

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

設(shè)置強(qiáng)化信息:

curl_setopt($ch,CURLOPT_NOBODY,1);//設(shè)置不允許輸出HTMLbody體,如果在抓取頁(yè)面標(biāo)題等信息時(shí)設(shè)置此選項(xiàng)會(huì)大大加快速度

curl_setopt($ch,CURLOPT_TIMEOUT,$int);//設(shè)置允許執(zhí)行的最長(zhǎng)秒數(shù)(超時(shí)時(shí)間),設(shè)置數(shù)值小的時(shí)候,CURL會(huì)放棄執(zhí)行時(shí)間長(zhǎng)的頁(yè)面

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

cURL批處理功能的基本使用

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

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

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

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

3.curl_multi_exec($mh,$running);//執(zhí)行$mh句柄,并將$mh句柄的運(yùn)行狀態(tài)寫入$running變量中

4.當(dāng)$running為true時(shí)循環(huán)執(zhí)行curl_multi_close()函數(shù)

5.循環(huán)結(jié)束后遍歷$mh句柄,用curl_multi_getcontent()獲取第一個(gè)句柄的返回值

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

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

代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?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批處理時(shí)內(nèi)存占用過(guò)多的問(wèn)題

但是,執(zhí)行大批量的句柄時(shí)我們會(huì)發(fā)現(xiàn)一個(gè)很嚴(yán)重的問(wèn)題,那就是執(zhí)行時(shí)系統(tǒng)CPU占用率幾乎100%,幾乎是死機(jī)狀態(tài)了。糾其原因,那是因?yàn)樵?running>0,執(zhí)行curl_multi_exec($mh,$running)而整個(gè)批處理句柄沒(méi)有全部執(zhí)行完畢時(shí),系統(tǒng)會(huì)不停地執(zhí)行curl_multi_exec()函數(shù)。我們用實(shí)驗(yàn)來(lái)證明:

我們?cè)谘h(huán)中curl_multi_exec($mh,$running)句前加入一個(gè)echo"a";的語(yǔ)句。我們的目的是執(zhí)行50次對(duì)百度的訪問(wèn),然后來(lái)看一下結(jié)果。

淺談PHP模擬發(fā)送POST請(qǐng)求之curl基本使用

從圖中滾動(dòng)條的大小(滾動(dòng)條已經(jīng)最小狀態(tài)了)可以大概看出輸出a的個(gè)數(shù),500個(gè)也不止,所以我們便可以找到占用CPU的罪魁禍?zhǔn)琢恕?/p>

cURL批處理時(shí)的內(nèi)存優(yōu)化方案

進(jìn)行改動(dòng)的方式是應(yīng)用curl函數(shù)庫(kù)中的curl_multi_select()函數(shù),其函數(shù)原型如下:

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

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

我用們curl_multi_select()函數(shù)來(lái)達(dá)到?jīng)]有需要讀取的程序就阻塞住的目的。

我們對(duì)批處理的第3、4步進(jìn)行優(yōu)化,利用其多線程,模擬并發(fā)程序。

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$running = null;
 
do {
 
    $mrc = curl_multi_exec($mh, $running);
 
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
 
//本次循環(huán)第一次處理$mh批處理中的$ch句柄,并將$mh批處理的執(zhí)行狀態(tài)寫入$running,當(dāng)狀態(tài)值等于CURLM_CALL_MULTI_PERFORM時(shí),表明數(shù)據(jù)還在寫入或讀取中,執(zhí)行循環(huán),當(dāng)?shù)谝淮?ch句柄的數(shù)據(jù)寫入或讀取成功后,狀態(tài)值變?yōu)镃URLM_OK,跳出本次循環(huán),進(jìn)入下面的大循環(huán)之中。
 
//$running為true,即$mh批處理之中還有$ch句柄正待處理,$mrc==CURLM_OK,即上一次$ch句柄的讀取或?qū)懭胍呀?jīng)執(zhí)行完畢。
 
while ($running && $mrc == CURLM_OK) {
 
    if (curl_multi_select($mh) != -1) {//$mh批處理中還有可執(zhí)行的$ch句柄,curl_multi_select($mh) != -1程序退出阻塞狀態(tài)。
 
        do {                            //繼續(xù)執(zhí)行需要處理的$ch句柄。
 
             $mrc = curl_multi_exec($mh, $running);
 
        } while ($mrc == CURLM_CALL_MULTI_PERFORM);
 
    }
 
}

這樣執(zhí)行的好處是$mh批處理中的$ch句柄會(huì)在讀取或?qū)懭霐?shù)據(jù)結(jié)束后($mrc==CURLM_OK),進(jìn)入curl_multi_select($mh)的阻塞階段,而不會(huì)在整個(gè)$mh批處理執(zhí)行時(shí)不停地執(zhí)行curl_multi_exec,白白浪費(fèi)CPU資源。

cURL批處理的內(nèi)存優(yōu)化結(jié)果

完整代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?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);
 
      ?>

我們?cè)俅卧?mrc=curl_multi_exec($mh,$running)句子前加入echo"a";結(jié)果如下圖:

淺談PHP模擬發(fā)送POST請(qǐng)求之curl基本使用

雖然也不止50次,但是比之未優(yōu)化前,CPU使用率已經(jīng)大為改觀。

雖然curl函數(shù)非常強(qiáng)大,但是我們還是有使用其他函數(shù)來(lái)發(fā)送POST請(qǐng)求的機(jī)會(huì),另外也能從更底層了解curl函數(shù),所以本輯也用大很大篇幅在其他函數(shù)上。

以上就是淺談PHP模擬發(fā)送POST請(qǐng)求之curl基本使用的詳細(xì)內(nèi)容,更多關(guān)于PHP模擬發(fā)送POST請(qǐng)求之curl基本使用的資料請(qǐng)關(guān)注服務(wù)器之家其它相關(guān)文章!

原文鏈接:https://www.cnblogs.com/zhenbianshu/p/4935679.html

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 亚洲一区中文字幕 | 欧美日韩国产一区二区三区不卡 | 国产av毛片| 欧美激情网址 | 日韩福利视频 | av中文在线 | 99久久精品免费看国产一区二区三区 | 国产精品美乳一区二区免费 | 在线观看一区二区精品 | av片免费观看| 欧美一区二区三区xxxx监狱 | 国产日韩精品一区二区 | 久久99综合久久爱伊人 | 最近中文字幕免费mv视频7 | 久久久免费视频观看 | 久久精品2019中文字幕 | 久久精彩视频 | 啵啵影院午夜男人免费视频 | 国产精品一区二区三区免费 | 在线四区 | 欧美一级片毛片免费观看视频 | 伊人久久精品久久亚洲一区 | 日韩欧美一区二区中文字幕 | 狠狠色狠狠色合久久伊人 | 美女视频黄的免费 | 亚洲精品久久久久久一区二区 | a级毛片免费在线 | 在线看片你懂得 | 亚洲高清视频在线观看 | 久久草视频| 黄色一级毛片在线观看 | 久久成人免费视频 | 综合网激情 | 久久国产精品免费一区二区三区 | 精品久久久久久久久久久久 | 国产精品18久久久久久久久久久久 | 羞羞视频免费观看网站 | 成人高清av | 免费在线观看黄色 | 日韩成人在线播放 | 大尺度av在线 |