成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

PHP cURL請(qǐng)求詳解

paney129 / 3195人閱讀

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

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

file_get_contents

fsockopen

curl

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

函數(shù)聲明:

/** 函數(shù)作用:將整個(gè)文件讀入字符串
    @param $filename 讀取的文件名或url,如果是文件路徑,$use_include_path需置為true
    @param $use_include_path 是否使用文件目錄路徑查找,如果是文件查找,需要置為true,默認(rèn)為false
    @param $context 資源參數(shù),使用stream_context_create創(chuàng)造的一個(gè)上下文,用于配置讀取文件的參數(shù),如配置HTTP請(qǐng)求的方法和頭部信息
    @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í)例獲取數(shù)據(jù):

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

函數(shù)聲明:

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

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

注意:在我的測試環(huán)境中報(bào)錯(cuò):`Unable to find the socket transport "http" - did you
forget to enable it when you configured
PHP?`,是由于php.ini配置問題,所以不推薦此種方法獲取,因?yàn)槭芘渲梦募绊?,很容易不可用?/pre>
// 筆者開發(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í)例獲取數(shù)據(jù):

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

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

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

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

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

// 100次file_get_contents請(qǐng)求,結(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次總耗時(shí):", "$cost";

// 100次curl請(qǐng)求,結(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次總耗時(shí):", "$cost";

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

cURL詳解

curl的基本使用方法就是:

curl_init()初始化cURL會(huì)話

curl_setopt()curl_setopt_array()設(shè)置配置選項(xiàng)

curl_exec()執(zhí)行會(huì)話

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

curl_init()

函數(shù)聲明:

/** 函數(shù)作用:初始化curl會(huì)話
    @param $url 配置中的請(qǐng)求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傳輸選項(xiàng)
    @param $ch curl_init()返回的cURL句柄
    @param $option 需要設(shè)置的CURLOPT_XXX選項(xiàng)
    @param $value 在option選項(xiàng)上設(shè)置的值
    @return bool 成功返回true,失敗返回false
*/
bool curl_setopt(resource $ch, int $option, mixed $value)

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

使用實(shí)例:

// 設(shè)置url和不直接輸出結(jié)果,單項(xiàng)設(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í)會(huì)將頭文件的信息作為數(shù)據(jù)流輸出。

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

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

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

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

CURLOPT_PORT 用來指定連接端口。

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

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

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

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

curl_exec()

函數(shù)聲明:

/** 函數(shù)作用:執(zhí)行curl會(huì)話
    @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會(huì)話
    @param $ch curl_init()返回的cURL句柄
    @return void
*/
void curl_close(resource $ch)
curl請(qǐng)求封裝
public static function parseApi($vars = Array(), $timeout = 60, $uri = "") {
    // 初始化curl
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $uri);
    // 支持POST請(qǐng)求
    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è)置超時(shí),防止機(jī)器被大量超時(shí)請(qǐng)求卡死
    curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
    // 請(qǐng)求數(shù)據(jù)
    $response = curl_exec($ch);
    // 關(guān)閉請(qǐng)求
    curl_close($ch);
    // 對(duì)數(shù)據(jù)進(jìn)行編碼,方便前后端數(shù)據(jù)處理
    $result = json_decode($response, true);
    // PHP返回?cái)?shù)據(jù)
    return $result;
}
PHP cURL并行請(qǐng)求

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

總結(jié)

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

參考資料

PHP手冊(cè) file_get_contents: http://php.net/manual/zh/func...

PHP手冊(cè) stream_context_create: http://php.net/manual/zh/func...

PHP手冊(cè) fsockopen: http://php.net/manual/zh/func...

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

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

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

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/30815.html

相關(guān)文章

  • PHP使用CURL詳解

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

    yedf 評(píng)論0 收藏0
  • PHP實(shí)現(xiàn)并發(fā)請(qǐng)求

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

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

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

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

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

    airborne007 評(píng)論0 收藏0
  • phpcurl實(shí)現(xiàn)http與https請(qǐng)求的方法

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

    loonggg 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<