Maison  >  Article  >  développement back-end  >  怎么php使用socket获取远程图片

怎么php使用socket获取远程图片

高洛峰
高洛峰original
2016-11-29 09:13:421276parcourir

步骤:

1,匹配URL中的主机名和文件部分

2,创建socket并连接到目标服务器

3,构造HTTP请求并发送

4,读取HTTP响应并解析

5,保存内容到文件并关闭socket连接


代码实现如下:

<?php
/*
 * 使用socket获取远程资源(网页,图片等)
 * url 资源URL
 * savepath 资源的保存路径
 * return true/false
 */
function get_remote_picture($url,$savepath="./"){
    set_time_limit(0);
    $pattern = &#39;/(http:\/\/)?([^\/]+)(.+)/&#39;;
    $res = preg_match($pattern, $url, $matches);
    if($res == 0){
        return false;
    }
    $host = "";//主机名
    $file = "";//请求的文件
    if(count($matches) == 3){
        $host = $matches[1];
        $file = $matches[2];
    }else if(count($matches) == 4){
        $host = $matches[2];
        $file = $matches[3];
    }else{
        return false;
    }
    $socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
    $res = socket_connect($socket,gethostbyname($host),80);
    if(!$res){
        //echo socket_strerror(socket_last_error($socket));
        socket_close($socket);
        return false;
    }
    $request = "";
    $request .= "GET $file HTTP/1.1\r\n";
    $request .= "Host: $host\r\n";
    $request .= "Connection: close\r\n\r\n";
    $len = socket_write($socket,$request);
 
    $response = "";
    while($buf=socket_read($socket,512)){
        if(strlen($buf) == 0){
            break;
        }
        $response .= $buf;
    }
    if(strpos($response,"\r\n\r\n")){
        $arr = explode("\r\n\r\n",$response);
        if(!file_exists($savepath)){
            @mkdir($savepath);
        }
        $savepath = rtrim($savepath,&#39;/&#39;).&#39;/&#39;;
        file_put_contents($savepath.basename($file),$arr[1]);
    }else{
        socket_close($socket);
        return false;
    }
    socket_close($socket);
    return true;
}
 
/* 获取百度logo */
$url = "http://su.bdimg.com/static/superplus/img/logo_white.png";
$result = get_remote_picture($url);
if($result){
    echo &#39;get remote picture success&#39;;
}else{
    echo &#39;get remote picture failed&#39;;
}


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn