摘要:不支持多進程,如果需要異步請求,非阻塞的方式,請選擇。時會發(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)cURL
"; } 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); }
需要安裝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最為簡潔,fsockopen和curl比較復(fù)雜。
在配置頭部信息上:
file_get_contents通過stream_context_set_option() 來配置頭部信息;
fsockopen可以通過fwirte ($socket, $config)的方式或字符串拼接配置請求頭部信息,支持異步請求;
curl可以通過curl_setopt($curl, $name, $key)的方式配置請求配置,作為lib庫,功能強大。
PHP不支持多進程,如果需要異步請求,非阻塞的方式,請選擇fsockopen。
常規(guī)的請求我們使用file_get_contents和curl,除了功能外,下面做一個性能測試:
$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
摘要:使用詳解是一個非常強大的開源庫,支持很多協(xié)議,包括等,我們使用它來發(fā)送請求。它給我們帶來的好處是可以通過靈活的選項設(shè)置不同的協(xié)議參數(shù),并且支持。可以根據(jù)前綴是還是自動選擇是否加密發(fā)送內(nèi)容。傳輸前準(zhǔn)備耗時。上傳內(nèi)容的長度。 PHP使用CURL詳解 Curl是一個非常強大的開源庫,支持很多協(xié)議,包括HTTP、FTP、TELNET等,我們使用它來發(fā)送HTTP請求。它給我 們帶來的好處是可以...
摘要:不支持多線程模式和回調(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中,最直觀...
摘要:服務(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)站大...
摘要:使用發(fā)起請求時,我們會常用方法,具體的請求方式可以參考請求詳解這篇文章。但我推薦,為了請求的規(guī)范化,應(yīng)該全部使用對請求的參數(shù)進行編碼。 使用PHP發(fā)起請求時,我們會常用cURL方法,具體的PHP請求方式可以參考 PHP cURL請求詳解 這篇文章。 cURL發(fā)起POST請求 在使用中,如果你需要發(fā)送POST的請求,需要配置CURLOPT_POST和CURLOPT_POSTFIELDS...
這篇文章主要介紹了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)頁,一個訪問...
閱讀 3285·2021-11-24 09:39
閱讀 3866·2021-11-22 09:34
閱讀 4799·2021-08-11 11:17
閱讀 1060·2019-08-29 13:58
閱讀 2571·2019-08-28 18:18
閱讀 537·2019-08-26 12:24
閱讀 825·2019-08-26 12:14
閱讀 727·2019-08-26 11:58