欧美vvv,亚洲第一成人在线,亚洲成人欧美日韩在线观看,日本猛少妇猛色XXXXX猛叫

新聞資訊

    1. 拿來先試試手

    比如我們以著名的“測試網絡是否連接”的網站——百度為例,來嘗試下curl

    <?php

    // create curl resource

    $ch=curl_init();

    // set url

    curl_setopt($ch, CURLOPT_URL, "baidu.com");

    //return the transfer as a string

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    // $output contains the output string

    $output=curl_exec($ch);

    //echo output

    echo $output;

    // close curl resource to free up system resources

    curl_close($ch);

    ?>

    當你在本地環境瀏覽器打開這個php文件時,頁面出現的是百度的首頁,特么我剛才輸入的“localhost”呢?

    上面的代碼和注釋已經充分說明了這段代碼在干啥。

    $ch=curl_init(),創建了一個curl會話資源,成功返回一個句柄;

    curl_setopt($ch, CURLOPT_URL, "baidu.com"),設置URL,不用說;

    上面兩句可以合起來變一句$ch=curl_init("baidu.com");

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0)這是設置是否將響應結果存入變量,1是存入,0是直接echo出;

    $output=curl_exec($ch)執行,然后將響應結果存入$output變量,供下面echo;

    curl_close($ch)關閉這個curl會話資源。

    PHP中使用curl大致就是這么一個形式,其中第二步,通過curl_setopt方法來設置參數是最復雜也是最重要的,感興趣可以去看官方的關于可設置參數的詳細參考,長地讓你看得想吐,還是根據需要熟能生巧吧。

    小結一下,php中curl用法就是:創建curl會話 -> 配置參數 -> 執行 -> 關閉會話。

    下面我們來看一些常用的情景,我們需要如何“打扮自己”(配置參數)才能正確“撩妹”(正確撩到服務器)。

    2.GET和POST請求以及HTTPS協議處理

    2.1 GET請求

    我們以“在某網站github中搜索關鍵詞”為例

    //通過curl進行GET請求的案例

    <?php

    // create curl resource

    $ch=curl_init();

    // set url

    curl_setopt($ch, CURLOPT_URL, "https://github.com/search?q=react");

    //return the transfer as a string

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    // $output contains the output string

    $output=curl_exec($ch);

    //echo output

    echo $output;

    // close curl resource to free up system resources

    curl_close($ch);

    ?>

    好像和之前那個例子沒啥差別,但這里有2個可以提的點:

    1.默認請求方式是GET,所以不需要顯式指定GET方式;

    2.https請求,非http請求,可能有人在各個地方看到過HTTPS請求需要加幾行代碼繞過SSL證書的檢查等方式來成功請求到資源,但是這里好像并不需要,原因是什么?

    The two Curl options are defined as:

    CURLOPT_SSL_VERIFYPEER - verify the peer's SSL certificate

    CURLOPT_SSL_VERIFYHOST - verify the certificate's name against host

    They both default to true in Curl, and shouldn't be disabled unless you've got a good reason. Disabling them is generally only needed if you're sending requests to servers with invalid or self-signed certificates, which is only usually an issue in development. Any publicly-facing site should be presenting a valid certificate, and by disabling these options you're potentially opening yourself up to security issues.

    即,除非用了非法或者自制的證書,這大多數出現在開發環境中,你才將這兩行設置為false以避開ssl證書檢查,否者不需要這么做,這么做是不安全的做法。

    2.2 POST請求

    那如何進行POST請求呢?為了測試,先在某個測試服務器傳了一個接收POST的腳本:

    //testRespond.php

    <?php

    $phpInput=file_get_contents('php://input');

    echo urldecode($phpInput);

    ?>

    發送普通數據

    然后在本地寫一個請求:

    <?php

    $data=array(

    "name"=> "Lei",

    "msg"=> "Are you OK?"

    );

    $ch=curl_init();

    curl_setopt($ch, CURLOPT_URL, "http://測試服務器的IP馬賽克/testRespond.php");

    curl_setopt($ch, CURLOPT_POST, 1);

    //The number of seconds to wait while trying to connect. Use 0 to wait indefinitely.

    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);

    curl_setopt($ch, CURLOPT_POSTFIELDS , http_build_query($data));

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    $output=curl_exec($ch);

    echo $output;

    curl_close($ch);

    ?>

    瀏覽器運行結果是:

    name=Lei&msg=Are you OK?

    這里我們是構造了一個數組作為POST數據傳給服務器:

    • curl_setopt($ch, CURLOPT_POST, 1)表明是POST請求;
    • curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60)設置一個最長的可忍受的連接時間,秒為單位,總不能一直等下去變成木乃伊吧;
    • curl_setopt($ch, CURLOPT_POSTFIELDS , http_build_query($data))設置POST的數據域,因為這里是數組數據形式的(等會來講json格式),所以用http_build_query處理一下。

    對于json數據呢,又怎么進行POST請求呢?

    <?php

    $data='{"name":"Lei","msg":"Are you OK?"}';

    $ch=curl_init();

    curl_setopt($ch, CURLOPT_URL, "http://測試服務器的IP馬賽克/testRespond.php");

    curl_setopt($ch, CURLOPT_POST, 1);

    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);

    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Content-Length:' . strlen($data)));

    curl_setopt($ch, CURLOPT_POSTFIELDS , $data);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    $output=curl_exec($ch);

    echo $output;

    curl_close($ch);

    ?>

    瀏覽器執行,顯示:

    {"name":"Lei","msg":"Are you OK?"}

    3. 如何上傳和下載文件

    3.1 POST上傳文件

    同樣遠程服務器端我們先傳好一個接收腳本,接收圖片并且保存到本地,注意文件和文件夾權限問題,需要有寫入權限:

    <?php

    if($_FILES){

    $filename=$_FILES['upload']['name'];

    $tmpname=$_FILES['upload']['tmp_name'];

    //保存圖片到當前腳本所在目錄

    if(move_uploaded_file($tmpname,dirname(__FILE__).'/'.$filename)){

    echo ('上傳成功');

    }

    }

    ?>

    然后我們再來寫我們本地服務器的php curl部分:

    <?php

    $data=array('name'=>'boy', "upload"=>"@boy.png");

    $ch=curl_init();

    curl_setopt($ch, CURLOPT_URL, "http://遠程服務器地址馬賽克/testRespond.php");

    curl_setopt($ch, CURLOPT_POST, 1);

    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);

    curl_setopt($ch, CURLOPT_POSTFIELDS , $data);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    $output=curl_exec($ch);

    echo $output;

    curl_close($ch);

    ?>

    瀏覽器中運行一下,什么都米有,去看一眼遠程的服務器,還是什么都沒有,并沒有上傳成功。

    為什么會這樣呢?上面的代碼應該是大家搜索curl php POST圖片最常見的代碼,這是因為我現在用的是PHP5.6以上版本,@符號在PHP5.6之后就棄用了,PHP5.3依舊可以用,所以有些同學發現能執行啊,有些發現不能執行,大抵是因為PHP版本的不同,而且curl在這兩版本中實現是不兼容的,上面是PHP5.3的實現。

    下面來講PHP5.6及以后的實現,:

    <?php

    $data=array('name'=>'boy', "upload"=>"");

    $ch=curl_init();

    $data['upload']=new CURLFile(realpath(getcwd().'/boy.png'));

    curl_setopt($ch, CURLOPT_URL, "http://115.29.247.189/test/testRespond.php");

    curl_setopt($ch, CURLOPT_POST, 1);

    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);

    curl_setopt($ch, CURLOPT_POSTFIELDS , $data);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    $output=curl_exec($ch);

    echo $output;

    curl_close($ch);

    ?>

    這里引入了一個CURLFile對象進行實現,關于此的具體可查閱文檔進行了解。這時候再去遠程服務器目錄下看看,發現有了一張圖片了,而且確實是我們剛才上傳的圖片。

    3.2 獲取遠程服務器的圖片

    遠程服務器在她自己的目錄下存放了一個圖片叫girl.jpg,地址是她的web服務器根目錄/girl.jpg,現在我要去獲取這張圖片。

    <?php

    $ch=curl_init();

    $fp=fopen('./girl.jpg', 'w');

    curl_setopt($ch, CURLOPT_URL, "http://遠程服務器地址馬賽克/girl.jpg");

    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);

    curl_setopt($ch, CURLOPT_FILE, $fp);

    $output=curl_exec($ch);

    $info=curl_getinfo($ch);

    fclose($fp);

    $size=filesize("./girl.jpg");

    if ($size !=$info['size_download']) {

    echo "下載的數據不完整,請重新下載";

    } else {

    echo "下載數據完整";

    }

    curl_close($ch);

    ?>

    現在,在我們當前目錄下就有了一張剛拿到的照片啦,是不是很激動呢!

    這里值得一說的是curl_getinfo方法,這是一個獲取本次請求相關信息的方法,對于調試很有幫助,要善用。

    4. HTTP認證怎么搞

    那么拿到了用戶名和密碼,我們怎么通過PHP CURL搞定HTTP認證呢?

    PS:這里偷懶就不去搭HTTP認證去試了,直接放一段代碼,我們分析下。

    function curl_auth($url,$user,$passwd){

    $ch=curl_init();

    curl_setopt_array($ch, [

    CURLOPT_USERPWD=> $user.':'.$passwd,

    CURLOPT_URL=> $url,

    CURLOPT_RETURNTRANSFER=> true

    ]);

    $result=curl_exec($ch);

    curl_close($ch);

    return $result;

    }

    $authurl='http://要請求HTTP認證的地址';

    echo curl_auth($authurl,'vace','passwd');

    這里有一個地方比較有意思:

    curl_setopt_array 這個方法可以通過數組一次性地設置多個參數,防止有些需要多處設置的出現密密麻麻的curl_setopt方法。

    5.利用cookie模擬登陸

    首先我們先來分析一下,這個事情分兩步,一是去登陸界面通過賬號密碼登陸,然后獲取cookie,二是去利用cookie模擬登陸到信息頁面獲取信息,大致的框架是這樣的。

    <?php

    //設置post的數據

    $post=array (

    'email'=> '賬戶',

    'pwd'=> '密碼'

    );

    //登錄地址

    $url="登陸地址";

    //設置cookie保存路徑

    $cookie=dirname(__FILE__) . '/cookie.txt';

    //登錄后要獲取信息的地址

    $url2="登陸后要獲取信息的地址";

    //模擬登錄

    login_post($url, $cookie, $post);

    //獲取登錄頁的信息

    $content=get_content($url2, $cookie);

    //刪除cookie文件

    @ unlink($cookie);

    var_dump($content);

    ?>

    然后我們思考下下面兩個方法的實現:

    • login_post($url, $cookie, $post)
    • get_content($url2, $cookie)

    //模擬登錄

    function login_post($url, $cookie, $post) {

    $curl=curl_init();

    curl_setopt($curl, CURLOPT_URL, $url);

    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 0);

    curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie);

    curl_setopt($curl, CURLOPT_POST, 1);

    curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post));

    curl_exec($curl);

    curl_close($curl);

    }

    //登錄成功后獲取數據

    function get_content($url, $cookie) {

    $ch=curl_init();

    curl_setopt($ch, CURLOPT_URL, $url);

    curl_setopt($ch, CURLOPT_HEADER, 0);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);

    $rs=curl_exec($ch);

    curl_close($ch);

    return $rs;

    }

    至此,總算是模擬登陸成功,一切順利啦,通過php CURL“撩”服務器就是這么簡單。

    本文寫給剛入PHP坑不久的新手們,作為工具文檔,方便用時查閱。

    CURL是一個非常強大的開源庫,它支持很多種協議,例如,HTTP、HTTPS、FTP、TELENT等。日常開發中,我們經常會需要用到curl向其他系統api訪問。

    使用

    要想使用CURL,大致需要如下流程:

    1. 初始化CURL句柄
    2. 設置選項
    3. 執行并獲取結果
    4. 釋放CURL句柄

    參見如下示例:

    <?php
    $ch=curl_init();
     
    curl_setopt($ch,CURLOPT_URL,"http://www.baidu.com");
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
     
    $output=curl_exec($ch);
    if($output===FALSE ){
      echo "error:".curl_error($ch);
    }
     
    curl_close($ch);
     
     
    echo $output;

    在上面的代碼中,我們使用curl_init函數來初始化curl句柄,然后多次調用curl_setopt函數來設置多個選項,隨后我們調用curl_exec函數執行發送HTTP請求并從遠端接收相應數據,最終我們調用curl_close關閉curl句柄進行資源釋放。

    運行這段代碼,我們可以看到控制臺下,會輸出百度的頁面信息。

    對于選項部分:

    • CURLOPT_URL——設置請求的url及其使用的協議;
    • CURLOPT_RETURNTRANSFER——設置為1,表示返回的響應數據不會被從標準輸出輸出,而是作為返回值傳遞給output變量;否則,返回內容會被直接輸出到標準輸出,而返回值是錯誤號;

    以上我們就完成了一個簡單的CURL使用。



    下面我們看看如何設置GET和POST請求:

    Get請求

    其實我們上面的例子就是get請求,如果需要用到請求參數,可以直接在設置CURLOPT_URL選項時帶上請求參數。如下增加了一個hi參數,其值為hello:

    curl_setopt($ch,CURLOPT_URL,"http://www.baidu.com?hi=hello");

    Post請求

    對于POST請求,我們對最開始的例子做一些修改即可,代碼如下:

    curl_setopt($ch,CURLOPT_URL,"http://127.0.0.1/");
    curl_setopt($ch, CURLOPT_POSTFIELDS, 'hello=world');
    curl_setopt($ch, CURLOPT_POST, true);

    首先,我們將CURLOPT_URL選項的url改為本地環回地址的80端口。

    其次,我們加入了CURLOPT_POSTFIELDS來設置post請求中參數字段。

    最后,我們設置CURLOPT_POST選項為true,表示我們將發送一個POST類型請求。

    curl_setopt函數的第二個參數種類非常多,可以參考php官方站點中curl_getinfo函數的opt參數內容,在需要時進行設置。

    下面,我們在本地啟用nc來監聽80端口,這樣可以看到curl發來的請求,以驗證結果:

    curl_setopt函數的第二個參數種類非常多,可以參考php官方站點中curl_getinfo函數的opt參數內容,在需要時進行設置。$ nc -l 80
    POST / HTTP/1.1
    Host: 127.0.0.1
    Accept: */*
    Content-Length: 11
    Content-Type: application/x-www-form-urlencoded
     
    hello=world

    可以看到,nc中收到php發來的請求是POST請求,且我們的post參數在請求體中,并且請求頭部也加入了content-相關字段指定數據大小和類型等。



    下面,我們再來看看curl還能夠給我們哪些有用信息。

    獲取請求響應的相關信息

    利用curl_getinfo函數,我們可以獲取更多的與請求和響應相關的信息。只需要在curl_exec之后執行如下調用:

    $info=curl_getinfo($ch);

    我們可以看下info都包含些什么,以前面的例子為例,我們去掉最后的echo,然后在curl_exec后加入:

    $info=curl_getinfo($ch);
    foreach ($info as $k=> $v) {
        echo $k.": ".$v."\n";
    }

    輸出信息如下:

    url: http://www.baidu.com/      #網絡地址
    content_type: text/html         #響應數據類型
    http_code: 200                  #http響應碼
    header_size: 750                #響應頭大小
    request_size: 52                #請求大小
    filetime: -1                    #文件創建的時間
    ssl_verify_result: 0            #SSL驗證結果
    redirect_count: 0               #跳轉計數
    total_time: 0.028716            #總耗時
    namelookup_time: 0.004372       #DNS查詢耗時
    connect_time: 0.019615          #等待連接耗時
    pretransfer_time: 0.019732      #傳輸前準備耗時
    size_upload: 0                  #上傳數據大小
    size_download: 14613            #下載數據大小
    speed_download: 508880          #下載速度
    speed_upload: 0                 #上傳速度
    download_content_length: 14613  #下載內容長度
    upload_content_length: -1       #上傳內容長度
    starttransfer_time: 0.027137    #直到首字節傳輸開始的耗時
    redirect_time: 0                #重定向耗時
    redirect_url:                   #重定向url
    primary_ip: 119.75.216.20       #DNS解析后首選地址
    certinfo: Array                 #TLS的證書鏈
    primary_port: 80                #遠端端口
    local_ip: 192.168.1.xxx         #本地ip
    local_port: 51210               #本地端口

    這里,碼哥對字段做了標注。可以看到,不僅可以獲取基本的響應信息,還可以獲取公網地址、網速、耗時等信息。


    以上就是curl的簡單使用。

網站首頁   |    關于我們   |    公司新聞   |    產品方案   |    用戶案例   |    售后服務   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區    電話:010-     郵箱:@126.com

備案號:冀ICP備2024067069號-3 北京科技有限公司版權所有