PHP實現的帶逾時功能get_headers函數,phpget_headers_PHP教程

來源:互聯網
上載者:User

PHP實現的帶逾時功能get_headers函數,phpget_headers


代碼比較多,但是比較簡單,一眼就看穿的,so,文字盡量少寫了。
因為眾所周知的網路原因,gavatar也開始越來越慢,寫了一個小東西來解決這個問題,過程中遇到了get_headers這個函數,甚是憂傷,記錄下來,以免後來人踩坑。
更新記錄,函數稍微改了一下,傳回值基本和之前序列化後的結果一致,暫時沒考慮支援子項也支援數組等(考慮細節效能,還想把沒用的http頭砍掉….)
需求很簡單:擷取圖片的head資訊。
偵錯工具的時候發現這個函數的調用很緩慢,即使綁定ip,有時候都能蹦到20多秒。
尋思這個事情還是該加個逾時吧,但是看官方文檔,給出的匯出函數介面如下:
複製代碼 代碼如下:
array get_headers(string$url[,int$format=0])

你沒有看錯,這個東西沒有逾時介面…
上github翻看源碼,期望可以用他的底層實現來重新實現一套:
地址 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版的匯出函數。
於是造輪子開始:
複製代碼 代碼如下:
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;
}

對比最後結果:
原版又是蠻長的等待,不知道校正啥去了(沒繼續追代碼了,有興趣的童鞋可以去跟下玩):

複製代碼 代碼如下:
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]=>; rel="canonical"
[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
)

輪子版返回(瞬間返回,兩者內容略有不同,你仔細看就能發現一些有趣的地方了):

複製代碼 代碼如下:
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]=>; rel="canonical"
[Content-Length]=>0
)

http://www.bkjia.com/PHPjc/955976.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/955976.htmlTechArticlePHP實現的帶逾時功能get_headers函數,phpget_headers 代碼比較多,但是比較簡單,一眼就看穿的,so,文字盡量少寫了。 因為眾所周知的網路原...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.