亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在PHP項目中實現一個超時功能get_headers函數

發布時間:2020-12-21 15:44:41 來源:億速云 閱讀:221 作者:Leah 欄目:開發技術

這篇文章將為大家詳細講解有關怎么在PHP項目中實現一個超時功能get_headers函數,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

看官方文檔,給出的導出函數接口如下:

復制代碼 代碼如下:


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]=><http://www.gravatar.com/avatar/[省略...]?s=42&d=http%3A%2F%2F[省略...]&r=G>; rel="canonical"
    [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]=><http://www.gravatar.com/avatar/[省略...]?s=42&d=http%3A%2F%2F[省略...]&r=G>; rel="canonical"
    [Content-Length]=>0
)

關于怎么在PHP項目中實現一個超時功能get_headers函數就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

民和| 泰来县| 淮北市| 宣威市| 林芝县| 望江县| 乳源| 上杭县| 贵州省| 南京市| 波密县| 桦南县| 大足县| 景东| 江津市| 孝义市| 铁力市| 沂源县| 华容县| 临武县| 田阳县| 沾化县| 莱阳市| 神池县| 辽阳县| 石河子市| 新绛县| 新竹市| 和田县| 张家界市| 东方市| 永顺县| 沁水县| 大新县| 寻乌县| 兰州市| 随州市| 安塞县| 凤台县| 老河口市| 松桃|