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
      相關PHP教程