PHP實(shí)現(xiàn)的帶超時(shí)功能get_headers函數(shù)
來(lái)源:易賢網(wǎng) 閱讀:792 次 日期:2015-02-11 14:25:41
溫馨提示:易賢網(wǎng)小編為您整理了“PHP實(shí)現(xiàn)的帶超時(shí)功能get_headers函數(shù)”,方便廣大網(wǎng)友查閱!
這篇文章主要介紹了PHP實(shí)現(xiàn)的帶超時(shí)功能的get_headers函數(shù),本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下

代碼比較多,但是比較簡(jiǎn)單,一眼就看穿的,so,文字盡量少寫了。

因?yàn)楸娝苤木W(wǎng)絡(luò)原因,gavatar也開始越來(lái)越慢,寫了一個(gè)小東西來(lái)解決這個(gè)問(wèn)題,過(guò)程中遇到了get_headers這個(gè)函數(shù),甚是憂傷,記錄下來(lái),以免后來(lái)人踩坑。

更新記錄,函數(shù)稍微改了一下,返回值基本和之前序列化后的結(jié)果一致,暫時(shí)沒(méi)考慮支持子項(xiàng)也支持?jǐn)?shù)組等(考慮細(xì)節(jié)性能,還想把沒(méi)用的http頭砍掉….)

需求很簡(jiǎn)單:獲取圖片的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])

你沒(méi)有看錯(cuò),這個(gè)東西沒(méi)有超時(shí)接口…

上github翻看源碼,期望可以用他的底層實(shí)現(xiàn)來(lái)重新實(shí)現(xiàn)一套:

地址

代碼如下:

/* {{{ 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也都沒(méi)有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é)果:

原版又是蠻長(zhǎng)的等待,不知道校驗(yàn)啥去了(沒(méi)繼續(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

)

更多信息請(qǐng)查看IT技術(shù)專欄

更多信息請(qǐng)查看網(wǎng)絡(luò)編程
易賢網(wǎng)手機(jī)網(wǎng)站地址:PHP實(shí)現(xiàn)的帶超時(shí)功能get_headers函數(shù)
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

2025國(guó)考·省考課程試聽報(bào)名

  • 報(bào)班類型
  • 姓名
  • 手機(jī)號(hào)
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢 | 簡(jiǎn)要咨詢須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專用圖標(biāo)