国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

PHP cURL請求詳解

paney129 / 3157人閱讀

摘要:不支持多進程,如果需要異步請求,非阻塞的方式,請選擇。時會發(fā)送請求,類型為,是表單提交時最常見的一種。允許函數(shù)執(zhí)行的最長秒數(shù)。設(shè)定請求中部分的內(nèi)容。常規(guī)的使用來請求,功能強大,使用方便,按需配置。

在PHP后端的開發(fā)過程中,除了獲取數(shù)據(jù)庫的數(shù)據(jù)和處理數(shù)據(jù)的內(nèi)部邏輯,往往還需要請求其他服務(wù)器接口的數(shù)據(jù),我們一般有3種方式來獲取數(shù)據(jù),分別是:

file_get_contents

fsockopen

curl

3種常用的接口獲取方式簡述 file_get_contents

函數(shù)聲明:

/** 函數(shù)作用:將整個文件讀入字符串
    @param $filename 讀取的文件名或url,如果是文件路徑,$use_include_path需置為true
    @param $use_include_path 是否使用文件目錄路徑查找,如果是文件查找,需要置為true,默認(rèn)為false
    @param $context 資源參數(shù),使用stream_context_create創(chuàng)造的一個上下文,用于配置讀取文件的參數(shù),如配置HTTP請求的方法和頭部信息
    @param $offset 開始讀取數(shù)據(jù)的偏移值
    @param $maxlen 從$offset開始獲取多長的數(shù)據(jù)
    @return string 如果成功返回字符串,失敗返回false
*/
string file_get_contents(string $filename, bool $use_include_path = false, resource $context, int $offset = -1, int $maxlen)

實例獲取數(shù)據(jù):

// 筆者開發(fā)使用Yii2,所以路由控制器使用action的寫法
public function actionFetch() {
    // 該url為筆者寫的另外一篇文章,測試用
    $data = file_get_contents("https://segmentfault.com/a/1190000011549088");
    // 獲取到的數(shù)據(jù)需要輸出我們才能在前端請求看到返回的結(jié)果
    echo $data;
    // 結(jié)束本次請求
    return $data;
}
fsockopen

函數(shù)聲明:

/** 函數(shù)作用:打開一個網(wǎng)絡(luò)連接或者一個Unix套接字連接
    @param $hostname 初始化套接字連接到的主機
    @param $port 端口號,如果不傳遞,則不實用端口
    @param $errno 
    @param $errstr 字符串形式的錯誤信息
    @param $timeout 超時時間,單位為s
    @return resource 如果成功返回文件句柄,可以使用文件函數(shù)讀寫,失敗返回false
*/
resource fsockopen(string $hostname, int $port = -1, int &$errno, string &$errstr, float $timeout = ini_get("default_socket_timeout"))

實例獲取數(shù)據(jù):

注意:在我的測試環(huán)境中報錯:`Unable to find the socket transport "http" - did you
forget to enable it when you configured
PHP?`,是由于php.ini配置問題,所以不推薦此種方法獲取,因為受配置文件影響,很容易不可用。
// 筆者開發(fā)使用Yii2,所以路由控制器使用action的寫法
$fp = fsockopen("https://segmentfault.com/a/1190000011549088", 80);
if (!$fp) {
    echo "$errstr ($errno)
"; } else { $out = "GET / HTTP/1.1 "; $out .= "Host: www.example.com "; $out .= "Connection: Close "; fwrite($fp, $out); while (!feof($fp)) { echo fgets($fp, 128); } fclose($fp); }
cURL
需要安裝libcurl包。
cURL全稱commandLine Uniform Resource Locator,命令行統(tǒng)一資源定位器,用于在命令行上傳和下載url文件。提供用于程序開發(fā)的libcurl包。

實例獲取數(shù)據(jù):

// 初始化一個curl資源
$ch = curl_init("https://segmentfault.com/a/1190000011549088");
// 執(zhí)行該curl對象,返回結(jié)果
$data = curl_exec($ch);
// 關(guān)閉cURL資源,釋放系統(tǒng)資源
curl_close($ch);
3種方式的優(yōu)劣對比

在代碼風(fēng)格上,file_get_contents最為簡潔,fsockopencurl比較復(fù)雜。

在配置頭部信息上:
file_get_contents通過stream_context_set_option() 來配置頭部信息;
fsockopen可以通過fwirte ($socket, $config)的方式或字符串拼接配置請求頭部信息,支持異步請求;
curl可以通過curl_setopt($curl, $name, $key)的方式配置請求配置,作為lib庫,功能強大。

PHP不支持多進程,如果需要異步請求,非阻塞的方式,請選擇fsockopen
常規(guī)的請求我們使用file_get_contentscurl,除了功能外,下面做一個性能測試:

$url = "https://segmentfault.com/a/1190000011549088";

// 100次file_get_contents請求,結(jié)果為113s
$start = time();
for ($i = 0; $i < 100; $i++) {
    $data = file_get_contents($url);
}
$end = time();
$cost = $end - $start;
echo "file_get_contents 100次總耗時:", "$cost";

// 100次curl請求,結(jié)果為48s
$start = time();
for ($i = 0; $i < 100; $i++) {
    $ch = curl_init($url);
    // 設(shè)置不直接輸出結(jié)果,而是保存到$data中
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $data = curl_exec($ch);
}
$end = time();
$cost = $end - $start;
echo "curl 100次總耗時:", "$cost";

所以,在常規(guī)PHP請求中,我們使用curl的方式來請求接口數(shù)據(jù)。

cURL詳解

curl的基本使用方法就是:

curl_init()初始化cURL會話

curl_setopt()curl_setopt_array()設(shè)置配置選項

curl_exec()執(zhí)行會話

curl_close()關(guān)閉會話

curl_init()

函數(shù)聲明:

/** 函數(shù)作用:初始化curl會話
    @param $url 配置中的請求url,如果不傳遞,需要在curl_setopt()設(shè)置CURLOPT_URL
    @return resource 如果成功返回cURL句柄,失敗返回false
*/
resource curl_init([string $url = NULL])
curl_setopt()curl_setopt_array()

函數(shù)聲明:

/** 函數(shù)作用:設(shè)置cURL傳輸選項
    @param $ch curl_init()返回的cURL句柄
    @param $option 需要設(shè)置的CURLOPT_XXX選項
    @param $value 在option選項上設(shè)置的值
    @return bool 成功返回true,失敗返回false
*/
bool curl_setopt(resource $ch, int $option, mixed $value)

/** 函數(shù)作用:設(shè)置cURL傳輸選項
    @param $ch curl_init()返回的cURL句柄
    @param $options 需要設(shè)置的CURLOPT_XXX選項和值的數(shù)組
    @return bool 全部成功返回true,一個失敗立刻返回false
*/
bool curl_setopt_array(resource $ch, array $options)

使用實例:

// 設(shè)置url和不直接輸出結(jié)果,單項設(shè)置
curl_setopt($ch, CURLOPT_URL, "https://segmentfault.com/a/1190000011549088");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// 批量設(shè)置
curl_setopt_array($ch, array(
    CURLOPT_URL => "https://segmentfault.com/a/1190000011549088",
    CURLOPT_RETURNTRANSFER => true
));
CURLOPT_參數(shù)

列舉一些常用的參數(shù),全部參數(shù)可以在 PHP curl參數(shù)文檔 查閱。

CURLOPT_HEADER 啟用時會將頭文件的信息作為數(shù)據(jù)流輸出。

CURLOPT_POST TRUE 時會發(fā)送 POST 請求,類型為:application/x-www-form-urlencoded,是 HTML 表單提交時最常見的一種。

CURLOPT_RETURNTRANSFER TRUE 將curl_exec()獲取的信息以字符串返回,而不是直接輸出。

CURLOPT_UPLOAD TRUE 準(zhǔn)備上傳。

CURLOPT_CONNECTTIMEOUT 在嘗試連接時等待的秒數(shù)。設(shè)置為0,則無限等待。

CURLOPT_PORT 用來指定連接端口。

CURLOPT_TIMEOUT 允許 cURL 函數(shù)執(zhí)行的最長秒數(shù)。

CURLOPT_COOKIE 設(shè)定 HTTP 請求中"Cookie: "部分的內(nèi)容。多個 cookie 用分號分隔,分號后帶一個空格(例如, "fruit=apple; colour=red")。

CURLOPT_POSTFIELDS 全部數(shù)據(jù)使用HTTP協(xié)議中的 "POST" 操作來發(fā)送。該參數(shù)只支持一維數(shù)組,如果需要傳遞多維數(shù)組,需要使用http_build_query處理,更詳細的信息可以查看PHP cURL請求中CURLOPT_POSTFIELDS只支持一維數(shù)組這篇文章。

CURLOPT_URL 需要獲取的 URL 地址,也可以在curl_init() 初始化會話的時候。

curl_exec()

函數(shù)聲明:

/** 函數(shù)作用:執(zhí)行curl會話
    @param $ch curl_init()返回的cURL句柄
    @return mixed 成功返回true,失敗返回false;如果設(shè)置了CURLOPT_RETRUNTRANSFER為ture,成功返回執(zhí)行結(jié)果
*/
mixed curl_exec(resource $ch)
curl_close()

函數(shù)聲明:

/** 函數(shù)作用:關(guān)閉curl會話
    @param $ch curl_init()返回的cURL句柄
    @return void
*/
void curl_close(resource $ch)
curl請求封裝
public static function parseApi($vars = Array(), $timeout = 60, $uri = "") {
    // 初始化curl
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $uri);
    // 支持POST請求
    curl_setopt($ch, CURLOPT_POST, 1);
    // 不直接輸出,返回到變量
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    // 設(shè)置POST參數(shù)
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($vars));
    // 設(shè)置超時,防止機器被大量超時請求卡死
    curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
    // 請求數(shù)據(jù)
    $response = curl_exec($ch);
    // 關(guān)閉請求
    curl_close($ch);
    // 對數(shù)據(jù)進行編碼,方便前后端數(shù)據(jù)處理
    $result = json_decode($response, true);
    // PHP返回數(shù)據(jù)
    return $result;
}
PHP cURL并行請求

除了上面的curl_init之外,cURL還支持curl_multi_init并行請求,允許我們同時請求上百個接口,而不是foreach輪詢阻塞式的請求。詳細的可以查看我的另一篇文章:PHP實現(xiàn)并發(fā)請求。

總結(jié)

如果你需要非阻塞的請求,可以使用fsockopen()方法。
常規(guī)的使用curl來請求,功能強大,使用方便,按需配置。

參考資料

PHP手冊 file_get_contents: http://php.net/manual/zh/func...

PHP手冊 stream_context_create: http://php.net/manual/zh/func...

PHP手冊 fsockopen: http://php.net/manual/zh/func...

百度百科 curl: https://baike.baidu.com/item/...

維基百科 curl: https://zh.wikipedia.org/wiki...

PHP手冊 curl函數(shù):http://php.net/manual/zh/ref....

博客園 fsockopen實現(xiàn)異步請求:http://www.cnblogs.com/52fhy/...

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/30815.html

相關(guān)文章

  • PHP使用CURL詳解

    摘要:使用詳解是一個非常強大的開源庫,支持很多協(xié)議,包括等,我們使用它來發(fā)送請求。它給我們帶來的好處是可以通過靈活的選項設(shè)置不同的協(xié)議參數(shù),并且支持。可以根據(jù)前綴是還是自動選擇是否加密發(fā)送內(nèi)容。傳輸前準(zhǔn)備耗時。上傳內(nèi)容的長度。 PHP使用CURL詳解 Curl是一個非常強大的開源庫,支持很多協(xié)議,包括HTTP、FTP、TELNET等,我們使用它來發(fā)送HTTP請求。它給我 們帶來的好處是可以...

    yedf 評論0 收藏0
  • PHP實現(xiàn)并發(fā)請求

    摘要:不支持多線程模式和回調(diào)處理,因此內(nèi)部腳本都是同步阻塞式的,如果你發(fā)起一個的請求,那么程序就會阻塞,直到請求返回結(jié)果,才會繼續(xù)執(zhí)行代碼。參考資料手冊手冊預(yù)定義常量中實現(xiàn)多線程請求詳解每次使用同時并發(fā)多少請求合適簡書多線程及原理 后端服務(wù)開發(fā)中經(jīng)常會有并發(fā)請求的需求,比如你需要獲取10家供應(yīng)商的帶寬數(shù)據(jù)(每個都提供不同的url),然后返回一個整合后的數(shù)據(jù),你會怎么做呢? 在PHP中,最直觀...

    zhangfaliang 評論0 收藏0
  • [轉(zhuǎn)]詳解PHP設(shè)置定時任務(wù)的實現(xiàn)方法

    摘要:服務(wù)器定時任務(wù)服務(wù)器定時任務(wù)需要你是獨立的服務(wù)器,或者是,總之就是對系統(tǒng)的配置有足夠的權(quán)限,虛擬空間就不要折騰這個方法了,因為你沒有權(quán)限。 文章轉(zhuǎn)載自:問說網(wǎng) ? 詳解PHP設(shè)置定時任務(wù)的實現(xiàn)方法地址:http://www.uedsc.com/php-timing-task.html 定時運行任務(wù)對于一個網(wǎng)站來說,是一個比較重要的任務(wù),比如定時發(fā)布文檔,定時清理垃圾信息等,現(xiàn)在的網(wǎng)站大...

    lemon 評論0 收藏0
  • PHP cURL請求CURLOPT_POSTFIELDS只支持一維數(shù)組

    摘要:使用發(fā)起請求時,我們會常用方法,具體的請求方式可以參考請求詳解這篇文章。但我推薦,為了請求的規(guī)范化,應(yīng)該全部使用對請求的參數(shù)進行編碼。 使用PHP發(fā)起請求時,我們會常用cURL方法,具體的PHP請求方式可以參考 PHP cURL請求詳解 這篇文章。 cURL發(fā)起POST請求 在使用中,如果你需要發(fā)送POST的請求,需要配置CURLOPT_POST和CURLOPT_POSTFIELDS...

    airborne007 評論0 收藏0
  • phpcurl實現(xiàn)http與https請求的方法

    這篇文章主要介紹了php之curl實現(xiàn)http與https請求的方法,分別講述了PHP訪問http網(wǎng)頁與訪問https網(wǎng)頁的實例,以及相關(guān)的注意事項,需要的朋友可以參考下。 本文實例講述了php之curl實現(xiàn)http與https請求的方法,分享給大家供大家參考。具體如下:通常來說,php的curl函數(shù)組可以幫助我們把機器偽裝成人的行為來抓取網(wǎng)站,下面來分享兩個例子,一個是訪問http網(wǎng)頁,一個訪問...

    loonggg 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<