Heim  >  Artikel  >  Backend-Entwicklung  >  So verwenden Sie Socket, um Remote-Bilder in PHP abzurufen

So verwenden Sie Socket, um Remote-Bilder in PHP abzurufen

高洛峰
高洛峰Original
2016-11-29 09:13:421273Durchsuche

Schritte:

1. Passen Sie den Hostnamen und den Dateiteil in der URL an

2. Erstellen Sie einen Socket und stellen Sie eine Verbindung zum Zielserver her HTTP-Anfrage und senden Sie sie

4, lesen Sie die HTTP-Antwort und analysieren Sie sie

5, speichern Sie den Inhalt in einer Datei und schließen Sie die Socket-Verbindung


Der Code ist wie folgt implementiert:

<?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;;
}

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn