PHP实现的带超时功能get

  这篇文章主要介绍了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

 

  )

 

时间: 2024-09-12 09:41:55

PHP实现的带超时功能get的相关文章

网速限制,带限速功能的无线路由器

为了摆脱pps影响网速和bt造成网速慢的问题,共享上网就应该对网速进行限制. 说到网速限制,大家可能会想到p2p终结者.p2p终结者是一款可以限制局域网电脑网速的软件,被很多人所利用. 网速限制,通过无限路由器设置也可以轻松搞定,这里给大家介绍一款带限速功能的无线路由器. 带限速功能的无线路由器 TD-W89541G增强型,支持ADSL(电话线).LAN(小区宽带)两种接入方式,用户可根据自身实际情况,选择合适的接入方式.ADSL接入部分符合ADSL.ADSL2.ADSL2+标准,最高下行速率可

Win8.1系统自带分区功能怎么用

  Win8.1系统自带分区功能怎么用 1.右键单击开始按钮-控制面板; 2.进入系统和安全-创建并格式化分区-进入磁盘管理; 3.右键单击选择删除卷.删除完之后,右键单击选择就可以对腾出的硬盘空间重新进行分区了;

JQuery实现带排序功能的权限选择实例

  本文实例讲述了JQuery实现带排序功能的权限选择.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 7

edge浏览器自带adblock功能用法介绍

  edge浏览器自带adblock功能用法介绍 北京时间4月1日上午最新消息,微软周四公布了一系列新的Edge浏览器插件,其中包括Pinterest.Adblock.Adblock Plus.LastPass.亚马逊助手.Evernote,和来自Vorlon.js的Page Analyzer. 两周前,微软发布新Win10预览版,使Edge浏览器支持插件.此前,插件是微软新款浏览器所缺少的最主要功能.不过,微软当时只发布3款插件,分别为鼠标手势.微软翻译,以及Reddit增强套件. 业内人士此

word2013怎么使用自带翻译功能翻译文档

  使用自带翻译功能翻译文档的步骤如下: 步骤一:在"审阅"选项卡"语言"组单击"翻译",在展开的列表中单击"选择转换语言". 步骤二:打开"翻译语言选项"对话框,根据需要设置文档的翻译语言,然后单击"确定". 步骤三:在"审阅"选项卡"语言"组单击"翻译",在展开的列表中单击"翻译文档".这时候会打开在线翻

XP系统自带“计算机管理”功能在什么位置?

  XP系统自带"计算机管理"功能在什么位置?          方法一: 1.第一种方法是小编介绍方法当中最简单的.打开Windows XP系统,鼠标右键右键点击"我的电脑",然后点击"管理". 2.这样,"计算机管理"轻轻松松就被打开了. 方法二: 1.第二种方法是利用控制面板打开.打开Windows XP系统中的"开始",然后点击"控制面板". 2.打开"控制面板&quo

给Python中的MySQLdb模块添加超时功能的教程

  这篇文章主要介绍了给Python中的MySQLdb模块添加超时功能的教程,timeout功能在服务器的运维当中非常有用,需要的朋友可以参考下 使用Python操作MySQL数据库的时候常使用MySQLdb这个模块. 今天在开发的过程发现MySQLdb.connect有些参数没法设置.通过这个页面我们可以看到在connect的时候,可以设置的option和client_flags和MySQL c api相比差不少. 一个很重要的参数 MYSQL_OPT_READ_TIMEOUT没法设置,这个参

用Windows自带的功能保护秘密不泄漏

Windows自带的功能,为了方便我们的使用,有自动记录的功能,但是这些功能有些事情也把我们的"行踪"给暴露了,这个时候应该怎么办呢?请看本文为你介绍的八种方法,可以让你使用的电脑了无痕迹. 1.彻底地一次删除文件 首先,应从系统中清除那些你认为已肯定不用的文件,这里我们指的是你丢弃到回收站中的所有垃圾文件.当然,我们还可以在任何想起的时候把回收站清空(双击回收站图标,然后选择"文件"菜单,再选择"清空回收站(B)" 命令),但更好的方法是关闭回

YII CGridView CListView 返回列表带记忆功能

我们知道Yii 中的CGridview 很好用,但是有时候不能满足我们的页面高制定性,这个时候更加灵活的CListView(只支持CActiveDataProvider) 就可以帮助我们解决这些问题CListView好更容易排版面和样式. CGridView是Yii中的一个灵活的插件GridView的每列为一个CGridColumn对象,通过Column加class来调用 例如它使用CButtonColumn来为每行生成按钮.在这里我们会介绍怎么根据需求自定义按钮. 默认按钮默认情况下 CBut