This article mainly introduces the get_headers function with timeout function implemented by PHP. This article directly gives the implementation code. Friends who need it can For reference
There are a lot of codes, but they are relatively simple and can be seen through at a glance, so I’ll write as few words 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. I recorded it to avoid being trapped later.
Updating the 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 very 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.
I think I should add a timeout for this matter, but looking at the official documentation, the export function interface given is as follows:
The code is as follows:
array get_headers(string$url[,int$format=0])
You read that right, this thing has no timeout interface...
Go to github and look at the source code, hoping to use its underlying implementation to re-implement a set:
Address https://github.com/php/php-src/blob/88ca46d92bc1c426e7c7f7313f0fd2b7dcc33cf6/ext/standard/url.c#L710
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... **/
}
/* }}} */
But unfortunately, zend_parse_parameters and ZEND_NUM_ARGS do not have exported functions in the PHP version.
Then the wheel-making begins:
Copy the 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;
}
Compare the final results:
The original version is quite a long wait. I don’t know what happened to the verification (I won’t continue to pursue the code. Interested children can follow it):
The code is as follows:
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/[Omitted...]
[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
)
Wheel version return (return instantly, the content of the two is slightly different, you can find some interesting things if you look carefully):
The code is as follows:
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/[Omitted...]
[Expires]=>Fri,12Dec201420:36:02GMT
[Source-Age]=>85
[Last-Modified]=>Wed,11Jan198408:00:00GMT
[X-Cache]=>302-HIT
[Link]=>
[Content-Length]=>0
)