curl 获取header信息(替代php get_headers)

function curl_get_headers($url, $opt = 0) {

$ch = curl_init($url);

curl_setopt($ch, CURLOPT_HEADER, 0);

curl_setopt($ch, CURLOPT_NOBODY, 1);

curl_exec($ch);

if($opt) {

$res = curl_getinfo($ch, $opt);

} else {

$res = curl_getinfo($ch);

}

curl_close($ch);

return $res;

}

$res = curl_get_headers($url, CURLINFO_FILETIME);

print_r($res);

opt参考http://www.php.net/manual/zh/function.curl-getinfo.php

如果$opt为空则返回数组,否则返回字符串。


以下是网友分享的方法:

一:[PHP]带超时功能的get_headers http://www.soulteary.com/2014/12/12/php-get_headers-with-timeout.html

function get_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) {

case 2:

return array($data[0] => $data[1]);

break;

case 1:

return $data;

break;

default:

break;

}

}

}, $data));

sort($data);

foreach ($data as $key => $value) {

$value_keys = array_keys($value);

$itemKey = $value_keys[0];

if (is_int($itemKey)) {

$data[$key] = $value[$itemKey];

} elseif (is_string($itemKey)) {

$data[$itemKey] = $value[$itemKey];

unset($data[$key]);

}

}

return $data;

}

二:PHP高效获取远程图片尺寸和大小 http://www.open-open.com/lib/view/open1391692619473.html

/**

* 获取远程图片的宽高和体积大小

*

* @param string $url 远程图片的链接

* @param string $type 获取远程图片资源的方式, 默认为 curl 可选 fread

* @param boolean $isGetFilesize 是否获取远程图片的体积大小, 默认false不获取, 设置为 true 时 $type 将强制为 fread

* @return false|array

*/

functionmyGetImageSize($url,$type='curl',$isGetFilesize= false)

{

// 若需要获取图片体积大小则默认使用 fread 方式

$type=$isGetFilesize?'fread':$type;

if($type=='fread') {

// 或者使用 socket 二进制方式读取, 需要获取图片体积大小最好使用此方法

$handle=fopen($url,'rb');

if(!$handle)returnfalse;

// 只取头部固定长度168字节数据

$dataBlock=fread($handle, 168);

}

else{

// 据说 CURL 能缓存DNS 效率比 socket 高

$ch= curl_init($url);

// 超时设置

curl_setopt($ch, CURLOPT_TIMEOUT, 5);

// 取前面 168 个字符 通过四张测试图读取宽高结果都没有问题,若获取不到数据可适当加大数值

curl_setopt($ch, CURLOPT_RANGE,'0-167');

// 跟踪301跳转

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

// 返回结果

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$dataBlock= curl_exec($ch);

curl_close($ch);

if(!$dataBlock)returnfalse;

}

// 将读取的图片信息转化为图片路径并获取图片信息,经测试,这里的转化设置 jpeg 对获取png,gif的信息没有影响,无须分别设置

// 有些图片虽然可以在浏览器查看但实际已被损坏可能无法解析信息

$size=getimagesize('data://image/jpeg;base64,'.base64_encode($dataBlock));

if(empty($size)) {

returnfalse;

}

$result['width'] =$size[0];

$result['height'] =$size[1];

// 是否获取图片体积大小

if($isGetFilesize) {

// 获取文件数据流信息

$meta= stream_get_meta_data($handle);

// nginx 的信息保存在 headers 里,apache 则直接在 wrapper_data

$dataInfo= isset($meta['wrapper_data']['headers']) ?$meta['wrapper_data']['headers'] :$meta['wrapper_data'];

foreach($dataInfoas$va) {

if( preg_match('/length/iU',$va)) {

$ts=explode(':',$va);

$result['size'] = trim(array_pop($ts));

break;

}

}

}

if($type=='fread') fclose($handle);

return$result;

}

// 测试的图片链接

echo'

';

$result= myGetImageSize('http://s6.mogujie.cn/b7/bao/120630/2kpa6_kqywusdel5bfqrlwgfjeg5sckzsew_345x483.jpg_225x999.jpg','curl');

print_r($result);


三:php获取远程图片的大小宽度高度 http://www.kuitao8.com/20140509/2401.shtml

/**  * Image class to simulate the getimagesize() function using the cURL and GD libraries *  * @package img_info  * @version 1.0.0  * @author MT Jordan* @copyright 2014

* @license zlib/libpng

* @link http://objsql.sourceforge.net

*/

class img_info

{

/**

* Determines how many characters will be read - set higher for larger files if getting errors

*/

private $range = 500000;

/**

* Constructor

*

* @access public

*/

public function __construct() {}

/**

* Method called to simulate the GD getimagesize() function w/o fopen wrapper

*

* @access public

* @param  str $src

* @return mixed

*/

public function getimagesize( $src )

{

if ( function_exists( 'curl_version' ) )

{

$img_dim = $this->get_img_dim( $src );

$img_info = $this->get_img_info( $src );

return array( $img_dim[0],

$img_dim[1],

$img_info[0],

"width=\"$img_dim[0]\" height=\"$img_dim[1]\"",

'colors' => $img_dim[2],

'mime' => $img_info[1],

'size' => $img_info[2] );

}

else

{

trigger_error( 'The curl extension is not enabled.', E_USER_WARNING );

return false;

}

}

/**

* Private method returns dimensional info

*

* @access private

* @param  str $src

* @return array

*/

private function get_img_dim( $src )

{

$headers = array( 'Range: bytes=0-' . $this->range );

$curl = curl_init( $src );

curl_setopt( $curl, CURLOPT_SSL_VERIFYPEER, false );

curl_setopt( $curl, CURLOPT_HTTPHEADER, $headers );

curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true );

$data = curl_exec( $curl );

curl_close( $curl );

$img = imagecreatefromstring( $data );

$colors = imagecolorstotal( $img );

$width = imagesx( $img );

$height = imagesy( $img );

$img_dim = array( $width, $height, $colors );

imagedestroy( $img );

return $img_dim;

}

/**

* Private method returns filetype and size info

*

* @access private

* @param  str $src

* @return array

*/

private function get_img_info( $src )

{

$curl = curl_init( $src );

curl_setopt( $curl, CURLOPT_SSL_VERIFYPEER, false );

curl_setopt( $curl, CURLOPT_URL, $src );

curl_setopt( $curl, CURLOPT_HEADER, true );

curl_setopt( $curl, CURLOPT_NOBODY, true );

curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true );

$data = str_replace( ' ', '', curl_exec( $curl ) );

curl_close( $curl );

$size = @explode( 'Content-Length:', $data );

//In the event Content-Length is not sent in the header

if ( array_key_exists( 1, $size ) )

{

$size = preg_split( '/\s+/', $size[1] );

$filesize = (int)$size[0];

}

else

$filesize = $this->get_img_size( $src );

$type = @explode( 'Content-Type:', $data );

$type = preg_split( '/\s+/', $type[1] );

if ( $type[0] === 'image/gif' )

$ext = 1;

elseif ( $type[0] === 'image/jpeg' || $type[0] === 'image/jpg' )

$ext = 2;

elseif ( $type[0] === 'image/png' )

$ext = 3;

else

$ext = 'N/A';

return array( $ext, $type[0], $filesize );

}

/**

* Private method returns filesize if Content-Length not sent in header

*

* @access private

* @param  str $src

* @return int

*/

private function get_img_size( $src )

{

$curl = curl_init();

curl_setopt( $curl, CURLOPT_SSL_VERIFYPEER, false );

curl_setopt( $curl, CURLOPT_URL, $src );

curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true );

curl_setopt( $curl, CURLOPT_HEADER, false );

$data = curl_exec( $curl );

curl_close( $curl );

return strlen( $data );

}

}

$img = new img_info;

print_r( $img->getimagesize( 'http://upload.wikimedia.org/wikipedia/commons/0/04/Labrys-symbol-transparent.png' ) );

你可能感兴趣的:(curl 获取header信息(替代php get_headers))