PHP實(shí)現(xiàn)的帶超時(shí)功能get_headers函數(shù)_PHP教程
推薦:Laravel框架中實(shí)現(xiàn)使用阿里云ACE緩存服務(wù)這篇文章主要介紹了Laravel框架中實(shí)現(xiàn)使用阿里云ACE緩存服務(wù),本文擴(kuò)展了一個(gè)ACE緩存驅(qū)動(dòng),以便使用阿里云ACE緩存服務(wù),需要的朋友可以參考下 之前我寫了一篇在 Laravel 4 框架中使用阿里云 OCS 緩存的文章,介紹了如何通過擴(kuò)展 Laravel 4 來支持需要 SASL 認(rèn)證的阿里云 O
這篇文章主要介紹了PHP實(shí)現(xiàn)的帶超時(shí)功能的get_headers函數(shù),本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下
代碼比較多,但是比較簡單,一眼就看穿的,so,文字盡量少寫了。
因?yàn)楸娝苤木W(wǎng)絡(luò)原因,gavatar也開始越來越慢,寫了一個(gè)小東西來解決這個(gè)問題,過程中遇到了get_headers這個(gè)函數(shù),甚是憂傷,記錄下來,以免后來人踩坑。
更新記錄,函數(shù)稍微改了一下,返回值基本和之前序列化后的結(jié)果一致,暫時(shí)沒考慮支持子項(xiàng)也支持?jǐn)?shù)組等(考慮細(xì)節(jié)性能,還想把沒用的http頭砍掉….)
需求很簡單:獲取圖片的head信息。
調(diào)試程序的時(shí)候發(fā)現(xiàn)這個(gè)函數(shù)的調(diào)用很緩慢,即使綁定ip,有時(shí)候都能蹦到20多秒。
尋思這個(gè)事情還是該加個(gè)超時(shí)吧,但是看官方文檔,給出的導(dǎo)出函數(shù)接口如下:
代碼如下:
array get_headers(string$url[,int$format=0])
你沒有看錯(cuò),這個(gè)東西沒有超時(shí)接口…
上github翻看源碼,期望可以用他的底層實(shí)現(xiàn)來重新實(shí)現(xiàn)一套:
地址 https://github.com/php/php-src/blob/88ca46d92bc1c426e7c7f7313f0fd2b7dcc33cf6/ext/standard/url.c#L710
代碼如下:
/* {{{ proto array get_headers(string url[, int format])
fetches all the headers sent by the server in response to a HTTP request */
PHP_FUNCTION(get_headers)
{
char*url;
size_t url_len;
php_stream_context*context;
php_stream*stream;
zval*prev_val,*hdr=NULL,*h;
HashTable*hashT;
zend_long format=0;
if(zend_parse_parameters(ZEND_NUM_ARGS()TSRMLS_CC,"s|l",&url,&url_len,&format)==FAILURE){
return;
}
/** 省略其他一堆... **/
}
/* }}} */
但是很不幸的是,zend_parse_parameters 和 ZEND_NUM_ARGS也都沒有PHP版的導(dǎo)出函數(shù)。
于是造輪子開始:
復(fù)制代碼 代碼如下:
functionget_url_headers($url,$timeout=10)
{
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_HEADER,true);
curl_setopt($ch,CURLOPT_NOBODY,true);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_TIMEOUT,$timeout);
$data=curl_exec($ch);
$data=preg_split('/\n/',$data);
$data=array_filter(array_map(function($data){
$data=trim($data);
if($data){
$data=preg_split('/:\s/',trim($data),2);
$length=count($data);
switch($length){
case2:
returnarray($data[0]=>$data[1]);
break;
case1:
return$data;
break;
default:
break;
}
}
},$data));
sort($data);
foreach($dataas$key=>$value){
$itemKey=array_keys($value)[0];
if(is_int($itemKey)){
$data[$key]=$value[$itemKey];
}elseif(is_string($itemKey)){
$data[$itemKey]=$value[$itemKey];
unset($data[$key]);
}
}
return$data;
}
對(duì)比最后結(jié)果:
原版又是蠻長的等待,不知道校驗(yàn)啥去了(沒繼續(xù)追代碼了,有興趣的童鞋可以去跟下玩):
代碼如下:
Array
(
[0]=>HTTP/1.0302Found
[Accept-Ranges]=>bytes
[Cache-Control]=>max-age=300
[Content-Type]=>Array
(
[0]=>text/html;charset=utf-8
[1]=>text/html;charset=utf-8
)
[Date]=>Array
(
[0]=>Fri,12Dec201415:35:40GMT
[1]=>Fri,12Dec201415:35:43GMT
)
[Expires]=>Fri,12Dec201415:40:40GMT
[Last-Modified]=>Wed,11Jan198408:00:00GMT
[Link]=>
[Location]=>http://i2.wp.com/[省略...]
[Server]=>Array
(
[0]=>ECS(oxr/838B)
[1]=>nginx
)
[Source-Age]=>85
[Via]=>1.1varnish
[X-Cache]=>302-HIT
[X-Varnish]=>14702550881470006304
[Content-Length]=>0
[Connection]=>Array
(
[0]=>close
[1]=>close
)
[1]=>HTTP/1.1504Gateway Timeout
)
輪子版返回(瞬間返回,兩者內(nèi)容略有不同,你仔細(xì)看就能發(fā)現(xiàn)一些有趣的地方了):
代碼如下:
Array
(
[0]=>HTTP/1.1302Found
[Accept-Ranges]=>bytes
[Via]=>1.1varnish
[Cache-Control]=>max-age=300
[Server]=>ECS(oxr/838B)
[Content-Type]=>text/html;charset=utf-8
[X-Varnish]=>14702550881470006304
[Date]=>Fri,12Dec201420:31:02GMT
[Location]=>http://i2.wp.com/[省略...]
[Expires]=>Fri,12Dec201420:36:02GMT
[Source-Age]=>85
[Last-Modified]=>Wed,11Jan198408:00:00GMT
[X-Cache]=>302-HIT
[Link]=>
[Content-Length]=>0
)
分享:Laravel中擴(kuò)展Memcached緩存驅(qū)動(dòng)實(shí)現(xiàn)使用阿里云OCS緩存這篇文章主要介紹了Laravel中擴(kuò)展Memcached緩存驅(qū)動(dòng)實(shí)現(xiàn)使用阿里云OCS緩存,本文擴(kuò)展了一個(gè)支持SASL 認(rèn)證模式的Memcached緩存驅(qū)動(dòng),需要的朋友可以參考下 Laravel 是我最近用得非常多而且越用就越喜歡的一款PHP框架,由于沒有向下兼容的歷史包袱,完全面向?qū)ο蟮娘L(fēng)格,借
- Laravel框架中實(shí)現(xiàn)使用阿里云ACE緩存服務(wù)
- Laravel中擴(kuò)展Memcached緩存驅(qū)動(dòng)實(shí)現(xiàn)使用阿里云OCS緩存
- php函數(shù)mysql_fetch_row、assoc、array、object的區(qū)別
- include(),require(),include_once(),require_once()的區(qū)別
- 基于GD2圖形庫的PHP生成圖片縮略圖類代碼分享
- 支持png透明圖片的php生成縮略圖類分享
- php面向?qū)ο笾衧tatic靜態(tài)屬性與方法的內(nèi)存位置分析
- php中g(shù)et_object_vars()方法用法實(shí)例
- php面向?qū)ο笾衧tatic靜態(tài)屬性和靜態(tài)方法的調(diào)用
- php延遲靜態(tài)綁定實(shí)例分析
- php定時(shí)執(zhí)行任務(wù)設(shè)置詳解
- 遷移PHP版本到PHP7
PHP教程Rss訂閱編程教程搜索
PHP教程推薦
- 解析php php_openssl.dll的作用
- 新手入門:PHP網(wǎng)站開發(fā)中常見問題匯總
- PHP中上傳大體積文件時(shí)需要的設(shè)置
- PHP使用zlib擴(kuò)展實(shí)現(xiàn)頁面GZIP壓縮輸出
- 如何批量替換相對(duì)地址為絕對(duì)地址(利用bat批處理實(shí)現(xiàn))
- php緩存技術(shù)
- php生成Excel文件 實(shí)現(xiàn)代碼
- 基于在生產(chǎn)環(huán)境中使用php性能測試工具xhprof的詳解
- PHP在線生成二維碼代碼(google api)
- mysql 時(shí)間轉(zhuǎn)換函數(shù)的用法
- 相關(guān)鏈接:
- 教程說明:
PHP教程-PHP實(shí)現(xiàn)的帶超時(shí)功能get_headers函數(shù)。