美文网首页闲杂
curl 获取header信息(替代php get_header

curl 获取header信息(替代php get_header

作者: 四季变幻 | 来源:发表于2015-11-12 11:27 被阅读2834次

    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_header

        本文链接:https://www.haomeiwen.com/subject/slihhttx.html