关闭顶部展开顶部

PHP实现的带超时功能get_headers函数_PHP教程

编辑Tag赚U币
教程Tag:暂无Tag,欢迎添加,赚取U币!

推荐:Laravel框架中实现使用阿里云ACE缓存服务
这篇文章主要介绍了Laravel框架中实现使用阿里云ACE缓存服务,本文扩展了一个ACE缓存驱动,以便使用阿里云ACE缓存服务,需要的朋友可以参考下 之前我写了一篇在 Laravel 4 框架中使用阿里云 OCS 缓存的文章,介绍了如何通过扩展 Laravel 4 来支持需要 SASL 认证的阿里云 O

  这篇文章主要介绍了PHP实现的带超时功能的get_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]=>

  [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]=>

  [Content-Length]=>0

 

  )

 

分享:Laravel中扩展Memcached缓存驱动实现使用阿里云OCS缓存
这篇文章主要介绍了Laravel中扩展Memcached缓存驱动实现使用阿里云OCS缓存,本文扩展了一个支持SASL 认证模式的Memcached缓存驱动,需要的朋友可以参考下 Laravel 是我最近用得非常多而且越用就越喜欢的一款PHP框架,由于没有向下兼容的历史包袱,完全面向对象的风格,借

来源:模板无忧//所属分类:PHP教程/更新时间:2015-02-10
loading.. 评论加载中....
相关PHP教程
闁汇埄鍨遍悺鏇綖閸℃稒鈷掓い鏇楀亾妞わ綇鎷�
婵炲濮崑鎾斥槈閺傝法澧涙俊鑼€濋柣銏╁灲閹凤拷
婵犵鈧啿鈧绱炲澶嬪殧鐎瑰嫭澹嗙换涔侀柣銏╁灲閹凤拷
婵犵鈧啿鈧绱炲澶婄闁诡垎鍕槬闁诲酣娼уΛ娑㈡偉閿燂拷
闂佺ǹ绻愰幊搴ㄥ焵椤掑倸甯堕幖瀛樼矒瀹曟繈鏁撻敓锟�
闂佺ǹ绻愰幊搴ㄥ焵椤掆偓閸氬绮婇敂鍓х煓閻庯絺鏅濋惌娆戠磽娓氬﹥瀚�
闂佽 鍋撴い鏍ㄧ☉閻︻噣鏌涘┑鎰胺缂併劍妞藉銊╊敍濞嗘垵绗¢梺鍝勫€婚幊鎾舵閿燂拷
闂佸搫鍟版慨椋庣礊婢舵劖鐓i悹杞拌濞层倕霉閿濆棙绀€闁告ɑ鐗犲畷鎰版晸閿燂拷
濠碘槅鍨崜婵嗩熆濡吋瀚绘い鎾寸箖鐎氾拷
婵犵鈧啿鈧绱炲鍥ㄥ妞ゆ挻绻冪€氳櫕淇婇妤€澧叉繝顫嫹
濠碘槅鍨崜婵嗩熆濮椻偓瀹曨剟顢欓崗鐓庘偓鐢告煛閸繄孝濠殿噯鎷�
濠碘槅鍨崜婵嗩熆濮椻偓閺屽懘鍩€椤掆偓閳诲酣骞戦幇闈涙闂佸搫瀚搁幏锟�
濠碘槅鍨崜婵嗩熆濮椻偓瀹曪綁骞嬪┑鍫紝
婵犵鈧啿鈧绱炲澶婄煑闁瑰瓨绻勯瀛樹繆椤栨澧叉繝顫嫹
闁诲骸鍘滈崜婵嬫偋閹惰棄鐭楀┑鐘插暙閼靛綊鏌ら懞銉ュ闁绘牭缍佸畷娆撴晸閿燂拷
UB闂佸湱绮崝妤呯嵁閸モ晜瀚氶悗娑櫳戦~锟�
闂佽壈椴稿濠氭焾鐎电硶鍋撻獮鍨仾婵犫偓閿燂拷
闁诲骸绠嶉崹鍝勶耿閸㈢嚜
闂佸憡姊绘慨椋庣礊婢跺瞼鍗氭繛鍡楀閸炲绻涚紙鐘哄厡闁稿骏鎷�
缂傚倷鐒﹂悷锕傚垂濠婂嫮顩锋い鎺嶇缁插湱鈧偣鍊濈紓姘额敊閿燂拷
©2017 www.mb5u.com濠碘槅鍨崜婵嗩熆濮椻偓瀵噣鎮╅幓鎺撳瘶
闂佽 鍋撻柟顖滃椤ワ拷&闂佸憡甯掑Λ鏃堟閿燂拷