程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP實現的帶超時功能get_headers函數

PHP實現的帶超時功能get_headers函數

編輯:關於PHP編程

      這篇文章主要介紹了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

     

      )

     
    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved