激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - PHP教程 - 淺談PHP模擬發送POST請求之curl基本使用

淺談PHP模擬發送POST請求之curl基本使用

2021-11-16 15:50枕邊書 PHP教程

今天來介紹PHP模擬發送POST請求的重型武器——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.關閉連接,回收資源。

?
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)函數獲取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執行時所攜帶的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批處理句柄。

代碼如下:

?
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批處理時內存占用過多的問題

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

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

淺談PHP模擬發送POST請求之curl基本使用

從圖中滾動條的大小(滾動條已經最小狀態了)可以大概看出輸出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步進行優化,利用其多線程,模擬并發程序。

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

?
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);
 
//本次循環第一次處理$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批處理的內存優化結果

完整代碼如下:

?
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);
 
      ?>

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

淺談PHP模擬發送POST請求之curl基本使用

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

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

以上就是淺談PHP模擬發送POST請求之curl基本使用的詳細內容,更多關于PHP模擬發送POST請求之curl基本使用的資料請關注服務器之家其它相關文章!

原文鏈接: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
主站蜘蛛池模板: 免费激情网址 | 亚洲一区国产二区 | 黄色电影免费网址 | 国产精品自拍啪啪 | 国产精选电影免费在线观看网站 | 欧美成人鲁丝片在线观看 | a视频在线播放 | 国产高潮失禁喷水爽到抽搐视频 | 性爱视频免费 | 色域tv| 日韩精品免费一区二区三区 | 高清成人在线 | 国产精品手机在线亚洲 | 欧美一区高清 | 国产在线看片 | 又黄又爽免费无遮挡在线观看 | 999久久久精品 | 密室逃脱第一季免费观看完整在线 | 久久久国产精品网站 | 一级国产航空美女毛片内谢 | 国产chinesehd精品91 | 亚洲av一级毛片特黄大片 | 国产91对白叫床清晰播放 | 欧洲黄视频 | 亚洲小视频在线 | 国产第一页精品 | 操嫩草 | 免费一级肉体全黄毛片 | 国产流白浆高潮在线观看 | 男女做性免费网站 | a网在线 | 久久草在线观看视频 | 久久久新 | 久久亚洲精品久久国产一区二区 | 色呦呦一区二区三区 | 综合精品一区 | 99久久久免费视频 | 国产精品久久久久久久久久久天堂 | 国产一区日韩精品 | 精精国产xxxx视频在线野外 | 鲁丝一区二区二区四区 |