摘要:不支持多進(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)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í)例獲取數(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最為簡潔,fsockopen和curl比較復(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_contents和curl,除了功能外,下面做一個(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
摘要:使用詳解是一個(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)求。它給我 們帶來的好處是可以...
摘要:不支持多線程模式和回調(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中,最直觀...
摘要:服務(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)站大...
摘要:使用發(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...
這篇文章主要介紹了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è)訪問...
閱讀 3339·2021-11-24 09:39
閱讀 3913·2021-11-22 09:34
閱讀 4877·2021-08-11 11:17
閱讀 1093·2019-08-29 13:58
閱讀 2622·2019-08-28 18:18
閱讀 570·2019-08-26 12:24
閱讀 863·2019-08-26 12:14
閱讀 768·2019-08-26 11:58