国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > PHP > 正文

PHP實現(xiàn)的帶超時功能get_headers函數

2024-05-04 21:54:43
字體:
來源:轉載
供稿:網友

  這篇文章主要介紹了PHP實現(xiàn)的帶超時功能的get_headers函數,本文直接給出實現(xiàn)代碼,需要的朋友可以參考下

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

  因為眾所周知的網絡原因,gavatar也開始越來越慢,寫了一個小東西來解決這個問題,過程中遇到了get_headers這個函數,甚是憂傷,記錄下來,以免后來人踩坑。

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

  需求很簡單:獲取圖片的head信息。

  調試程序的時候發(fā)現(xiàn)這個函數的調用很緩慢,即使綁定ip,有時候都能蹦到20多秒。

  尋思這個事情還是該加個超時吧,但是看官方文檔,給出的導出函數接口如下:

  代碼如下:

  array get_headers(string$url[,int$format=0])

  你沒有看錯,這個東西沒有超時接口…

  上github翻看源碼,期望可以用他的底層實現(xiàn)來重新實現(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版的導出函數。

  于是造輪子開始:

  復制代碼 代碼如下:

  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;

  }

  對比最后結果:

  原版又是蠻長的等待,不知道校驗啥去了(沒繼續(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

  )

  輪子版返回(瞬間返回,兩者內容略有不同,你仔細看就能發(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

 

  )

 

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 防城港市| 邵阳市| 饶河县| 思茅市| 三明市| 南开区| 龙州县| 永春县| 石柱| 长子县| 古田县| 太仓市| 西城区| 右玉县| 潢川县| 金寨县| 建始县| 恭城| 神农架林区| 曲沃县| 宣威市| 丹江口市| 黄陵县| 高密市| 方城县| 科技| 洪雅县| 芦溪县| 松溪县| 沁水县| 醴陵市| 萨迦县| 通州区| 城市| 百色市| 盐城市| 大方县| 海淀区| 会理县| 东兰县| 麻江县|