詳解php的curl幾個函數

来源:http://www.cnblogs.com/loveyoume/archive/2016/11/17/6072181.html
-Advertisement-
Play Games

關於php的curl一系列函數,這裡解釋一下它們的作用。 在html中,我們可以通過form設置http的post和get提交,但假如我們獲取的數據不是從html中來的,而是php腳本主動向其他伺服器提交呢?這個時候,我們應該怎麼實現post和get提交數據呢?答案就是php的curl函數或者str ...


  關於php的curl一系列函數,這裡解釋一下它們的作用。

  在html中,我們可以通過form設置http的post和get提交,但假如我們獲取的數據不是從html中來的,而是php腳本主動向其他伺服器提交呢?這個時候,我們應該怎麼實現post和get提交數據呢?答案就是php的curl函數或者stream_context_create函數,還有fsockopen函數等等方式,這裡講一下curl的提交設置,其他兩種有時間會寫一下。

  curl的函數實現http提交,關鍵就在四個函數:

    一個是:curl_init()

    作用:初始化curl的``套接流``

    第二個是:curl_setopt()

    作用:設置http提交參數

    第三個是:curl_exec()

    作用:執行curl ``套接流`` 的提交,並獲取伺服器返回的內容

    第四個:curl_close()

    作用:關閉已經實現http提交目的的``套接流``

    說是說四個函數,但實際的應用中,其實,就是設置curl_setopt這個函數的參數而已,其他三個都是跑龍套的,呵呵。

    不相信,下麵我們舉一個例子來利用curl系列函數實現http提交,不羅嗦了,直接上代碼:

  

<?php
/*
*創建一個curl_init提交函數,模擬get提交,模擬post提交,模擬json提交
*$url 提交的伺服器地址,必須
*$data 提交的數據,必須,是關聯數組,
*$method 提交的方式,必須,預設get提交,選項值,只能填get、post、json
*$options 其他選項,可有可以無,如果設置了,不能設置CURLOPT_URL,必須符合curl_setopt_array()的參數語法
*如果失敗則返回false,提交數據成功,則返回伺服器返回的結果
*/
function curl($url='',$data=array(),$method='get',$options=array()){
    //驗證數據傳進來的數據是否合法
    if(empty($url) || !filter_var($url,FILTER_VALIDATE_URL)){
        return false;
    }
    if(!is_array($data) && empty($data)){
        return false;
    }
    $method = strtolower($method);
    if(!in_array($method,array('get','post','json'))){
        return false;
    }
    //初始化curl句柄,
    $ch = curl_init();
    //設置伺服器返回的數據不直接輸出,而是保留在curl_exec()的返回值中
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
    if(!empty($options) && is_array($options)){
        if(curl_setopt_array($ch,$options) == false){
            return false;
        }
    }
    switch($method){
        case 'get':
            //把要提交的數據轉換為get鍵值對提交
            $data = http_build_query($data);
            curl_setopt($ch,CURLOPT_URL,$url.'?'.$data);
            //獲取curl執行後,伺服器返回的結果
            $return = curl_exec($ch);
            curl_close($ch);
            return $return;
            break;
        case 'post':
            curl_setopt($ch,CURLOPT_URL,$url);
            //設置post提交
            curl_setopt($ch,CURLOPT_POST,true);
            //提交post的數據
            curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
            $return = curl_exec($ch);
            curl_close($ch);
            return $return;
            break;
        case 'json':
            //設置json提交的數據
            $data = json_encode($data);
            curl_setopt($ch,CURLOPT_URL,$url);
            //設置post提交
            curl_setopt($ch,CURLOPT_POST,true);
            //json的數據通過post的方式提交
            curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
            $return = curl_exec($ch);
            curl_close($ch);
            return $return;
            break;
        default:
            return false;
        break;
    }
}
 $url = "http://www.test.com/curl_setopt/upload.php";
 //下麵是測試,本人是測試成功了,我伺服器是直接輸出$_POST,$_GET
 $data  = array( 'name'  =>  'Foo' );
 $method ='post';
 var_dump(curl($url,$data,$method));

 

  

    註意::這裡::

     json數據提交,伺服器必須以php://input獲取,如file_get_contents('php://input');

     bool curl_setopt_array ( resource $ch , array $options )的參數舉例:


     設置curl套接流$ch相應的選項

      $options = array(
      CURLOPT_SSL_VERIFYPEER => false,
      CURLOPT_HEADER => false
     );


     post和json,curl_setopt_array函數不能設置CURLOPT_POSTFIELDS,CURLOPT_POST這兩項
     因為我這函數沒有排除,要排除,你可以自己修改這個函數

 

     curl_setopt_array函數,其實也就是```批量```設置curl_setopt()函數的選項,

    他們的作用是一樣的,我這裡利用它,是為了方便


     post提交可以上傳文件,但是文件的地址必須這樣設置,下標為‘file’,地址前加@
     array('file' => '@D:\vhost\test\curl_setopt\xingxing.jpg')
    

    總結:

    假如上面的函數你看不懂,那不要緊,下麵我給你解釋一下,上面函數的主要意思:

    

    利用curl套接流實現http提交的設置步驟:

    首先:初始化curl

    這對應上面的第一個步驟:

//初始化curl句柄,
$ch = curl_init();

    其次:設置curl的參數,也就是設置http提交的參數,這對應上面的第二個步驟:

//把要提交的數據轉換為get鍵值對提交
$data = http_build_query($data);
curl_setopt($ch,CURLOPT_URL,$url.'?'.$data);

 

    http_build_query()這個函數的作用不過是把一個關聯數組格式化成get方式提交的url鍵值對形式,這個你自己可以百度,這裡不詳說了。

    這一步是curl設置套鏈接最關鍵的地方,你看下麵的post提交和json提交就知道了:

curl_setopt($ch,CURLOPT_URL,$url);
//設置post提交
curl_setopt($ch,CURLOPT_POST,true);
//提交post的數據
curl_setopt($ch,CURLOPT_POSTFIELDS,$data);

    看到沒有,設置post提交其實就是在curl_setopt函數中設置參數,

    $ch 是curl_init初始化的套接流,curl_setopt函數就是不停的在這個$ch套接流中設置參數,

    第一個參數:CURLOPT_URL,這是一個很關鍵的參數,它是設置要提交到哪裡的url

    第二個參數:CURLOPT_POST,設置提交的方式Post

    第三個參數:CURLOPT_POSTFIELDS,設置post的提交數據

    其他參數,我這裡就不列舉了,假如你需要參考,可以鏈接這裡:http://www.php.net/manual/zh/function.curl-setopt.php

    

    最後兩步:

    一步是:curl_exec(),這個是執行curl套接流$ch

//設置伺服器返回的數據不直接輸出,而是保留在curl_exec()的返回值中
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
$return = curl_exec($ch);

    這裡要說一下,你其實可以不設置CURLOPT_RETURNTRANSFER這個參數,假如你不設置,那麼,伺服器返回值將會echo出來,而不是保存在上面的$return中

    另一步是:

curl_close($ch);

    這個是關閉執行完成的套接流,免得它占用記憶體資源

    再給兩個函數:

    curl_errno():

    返回最後一次cURL操作的錯誤號。

    curl_error():

    返回一條最近一次cURL操作明確的文本的錯誤信息。

    這兩個函數可以追蹤curl_init套接流的錯誤信息,可以根據它們來調整設置curl過程中的錯誤。

    至此就結束了,有問題可以留言,有錯誤,望請指出,假如你指出我的錯誤,鄙人不勝感激,個人見識短淺,錯誤在所難免,群眾的眼睛才是雪亮的。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ...
  • 英文文檔: class str(object='') class str(object=b'', encoding='utf-8', errors='strict') Return a string version of object. If object is not provided, retu ...
  • 英文文檔: sum(iterable[, start]) Sums start and the items of an iterable from left to right and returns the total. start defaults to 0. The iterable‘s ite ...
  • ## 1.基本用法```##情形1 $name = laravel5<div class="title"> {{$name}} {{$name}}</div>//輸出結果是 larave5 larave5##情形2 $name = laravel5 並且使用@的情形<div class="title ...
  • 今日問題: 請問主程式運行結果是什麼?(點擊以下“【Java每日一題】20161117”查看20161116問題解析) 題目原發佈於公眾號、簡書:【Java每日一題】20161117,【Java每日一題】20161117 ...
  • 一個簡單的例子: 枚舉定義類: 測試類: 關鍵詞:實例,常量 枚舉也是一個類。從測試類的第5行知,枚舉變數的聲明與一般對象類的聲明是相同的(Spiciness howHot = ...)。 枚舉定義類的第4行:NOT,MILD...,每一串字母都是一個實例,每一個實例都是常量。即:Spiciness ...
  • ...
  • 1.內置函數補充 callable(object) 檢查對象object是否可調用 1、類是可以被調用的 2、實例是不可以被調用的,除非類中聲明瞭__call__方法 def f1(): print("test") f2 = "test" print(callable(f1)) print(call... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...