php使用socket獲取遠程圖片

步驟:
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 = '/(http:\/\/)?([^\/]+)(.+)/';
    $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,'/').'/';
        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 'get remote picture success';
}else{
    echo 'get remote picture failed';
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章