PHP实现的带超时功能get_headers函数
这篇文章主要介绍了PHP实现的带超时功能的get_headers函数,本文直接给出实现代码,需要的朋友可以参考下
代码比较多,但是比较简单,一眼就看穿的,so,文字尽量少写了。
因为众所周知的网络原因,gavatar也开始越来越慢,写了一个小东西来解决这个问题,过程中遇到了get_headers这个函数,甚是忧伤,记录下来,以免后来人踩坑。
更新记录,函数稍微改了一下,返回值基本和之前序列化后的结果一致,暂时没考虑支持子项也支持数组等(考虑细节性能,还想把没用的http头砍掉….)
需求很简单:获取图片的head信息。
调试程序的时候发现这个函数的调用很缓慢,,即使绑定ip,有时候都能蹦到20多秒。
寻思这个事情还是该加个超时吧,但是看官方文档,给出的导出函数接口如下:
复制代码 代码如下:
array get_headers(string$url[,int$format=0])
你没有看错,这个东西没有超时接口…
上github翻看源码,期望可以用他的底层实现来重新实现一套:
地址
复制代码 代码如下:
/* {{{ 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]=>[省略...]
[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
)
轮子版返回(瞬间返回,两者内容略有不同,你仔细看就能发现一些有趣的地方了):
复制代码 代码如下:

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











이번 장에서는 CakePHP의 환경 변수, 일반 구성, 데이터베이스 구성, 이메일 구성에 대해 알아봅니다.

PHP 8.4는 상당한 양의 기능 중단 및 제거를 통해 몇 가지 새로운 기능, 보안 개선 및 성능 개선을 제공합니다. 이 가이드에서는 Ubuntu, Debian 또는 해당 파생 제품에서 PHP 8.4를 설치하거나 PHP 8.4로 업그레이드하는 방법을 설명합니다.

CakePHP는 PHP용 오픈 소스 프레임워크입니다. 이는 애플리케이션을 훨씬 쉽게 개발, 배포 및 유지 관리할 수 있도록 하기 위한 것입니다. CakePHP는 강력하고 이해하기 쉬운 MVC와 유사한 아키텍처를 기반으로 합니다. 모델, 뷰 및 컨트롤러 gu

VS Code라고도 알려진 Visual Studio Code는 모든 주요 운영 체제에서 사용할 수 있는 무료 소스 코드 편집기 또는 통합 개발 환경(IDE)입니다. 다양한 프로그래밍 언어에 대한 대규모 확장 모음을 통해 VS Code는
