Home >Backend Development >PHP Tutorial >Get_headers function with timeout function implemented in PHP, phpget_headers_PHP tutorial

Get_headers function with timeout function implemented in PHP, phpget_headers_PHP tutorial

WBOY
WBOYOriginal
2016-07-13 10:07:091034browse

PHP implemented get_headers function with timeout function, phpget_headers

There is a lot of code, but it is relatively simple and can be seen through at a glance, so I have written as little text as possible.
Due to well-known network reasons, gavatar also started to become slower and slower. I wrote a small thing to solve this problem. In the process, I encountered the get_headers function. I was very sad and recorded it to prevent others from stepping into the trap later.
Update record, the function has been slightly changed, and the return value is basically the same as the previous serialized result. We have not considered supporting sub-items or arrays for the time being (considering detailed performance, I also want to cut off the useless http header...)
The requirement is simple: get the head information of the image.
When debugging the program, I found that the call of this function is very slow. Even if the IP is bound, it can sometimes jump to more than 20 seconds.
Thinking about this matter, I should add a timeout, but looking at the official documentation, the export function interface given is as follows:

Copy code The code is as follows:

array get_headers(string$url[,int$format=0])

You read that right, this thing has no timeout interface...
Check out the source code on github, hoping to re-implement it using its underlying implementation:
Address https://github.com/php/php-src/blob/88ca46d92bc1c426e7c7f7313f0fd2b7dcc33cf6/ext/standard/url.c#L710

Copy code The code is as follows:

/* {{{ 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;
}

/**Omit a bunch of other... **/
}
/* }}} */

Unfortunately, neither zend_parse_parameters nor ZEND_NUM_ARGS has exported functions in the PHP version.

So the wheel-making begins:

Copy code The code is as follows:

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]=>; 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]=>; rel="canonical"
    [Content-Length]=>0
)

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/955976.htmlTechArticlePHP实现的带超时功能get_headers函数,phpget_headers 代码比较多,但是比较简单,一眼就看穿的,so,文字尽量少写了。 因为众所周知的网络原...
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn