복붙노트

PHP를 사용하여 원격 파일이 있는지 확인하는 방법은 무엇입니까?

PHP

PHP를 사용하여 원격 파일이 있는지 확인하는 방법은 무엇입니까?

내가 찾을 수있는 최선의 방법은 fclose fopen 유형의 경우 페이지로드를 매우 느리게 만듭니다.

기본적으로 내가하려는 것은 다음과 같다 : 나는 웹 사이트 목록을 가지고 있으며, 그들 옆에 자신의 favicon을 표시하고 싶다. 그러나 사이트에없는 경우에는 깨진 이미지를 표시하는 대신 다른 이미지로 바꾸고 싶습니다.

해결법

  1. ==============================

    1.CURLOPT_NOBODY를 통해 HTTP HEAD 메소드를 사용하도록 말하게 할 수 있습니다.

    CURLOPT_NOBODY를 통해 HTTP HEAD 메소드를 사용하도록 말하게 할 수 있습니다.

    더 많거나 적은

    $ch = curl_init("http://www.example.com/favicon.ico");
    
    curl_setopt($ch, CURLOPT_NOBODY, true);
    curl_exec($ch);
    $retcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    // $retcode >= 400 -> not found, $retcode = 200, found.
    curl_close($ch);
    

    어쨌든 TCP 연결 설정 및 종료가 아니라 HTTP 전송 비용 만 저장하면됩니다. 그리고 favicons 작은, 당신은 많은 개선을 볼 수 없습니다.

    결과가 로컬에서 캐시되는 것은 너무 느린 것으로 판명되면 좋은 생각입니다. HEAD는 파일의 시간을 확인하여 헤더에 반환합니다. 브라우저와 마찬가지로 아이콘의 CURLINFO_FILETIME을 얻을 수 있습니다. 캐시에 URL => [favicon, timestamp]를 저장할 수 있습니다. 그런 다음 타임 스탬프를 비교하고 파비콘을 다시로드 할 수 있습니다.

  2. ==============================

    2.파이는 cURL을 사용할 수 있다고 말합니다. cURL을 사용하면 몸이 아니라 머리글 만 제공 할 수 있으므로 속도가 빨라질 수 있습니다. 나쁜 도메인은 요청 시간 초과를 기다리고 있기 때문에 항상 시간이 걸릴 수 있습니다. 아마도 cURL을 사용하여 제한 시간 길이를 변경할 수 있습니다.

    파이는 cURL을 사용할 수 있다고 말합니다. cURL을 사용하면 몸이 아니라 머리글 만 제공 할 수 있으므로 속도가 빨라질 수 있습니다. 나쁜 도메인은 요청 시간 초과를 기다리고 있기 때문에 항상 시간이 걸릴 수 있습니다. 아마도 cURL을 사용하여 제한 시간 길이를 변경할 수 있습니다.

    다음은 예제입니다. function remoteFileExists ($ url) {     $ curl = curl_init ($ url);     // 실제 페이지를 가져 오지 않는다. 연결 상태 만 확인하고 싶다.     curl_setopt ($ curl, CURLOPT_NOBODY, true);     // 요청한다.     $ 결과 = curl_exec ($ 컬);     $ ret = false;     // 요청이 실패하지 않은 경우     if ($ result! == false) {         // 요청이 정상이면 응답 코드를 확인하십시오.         $ statusCode = curl_getinfo ($ curl, CURLINFO_HTTP_CODE);         if ($ statusCode == 200) {             $ ret = true;         }     }     curl_close ($ curl);     return $ ret; } $ exists = remoteFileExists ( 'http://stackoverflow.com/favicon.ico'); if ($ exists) {     echo '파일이 존재합니다'; } else {     echo '파일이 존재하지 않습니다'; }

  3. ==============================

    3.CoolGoose의 솔루션은 좋지만 대용량 파일의 경우 더 빠릅니다 (1 바이트 만 읽으므로) :

    CoolGoose의 솔루션은 좋지만 대용량 파일의 경우 더 빠릅니다 (1 바이트 만 읽으므로) :

    if (false === file_get_contents("http://example.com/path/to/image",0,null,0,1)) {
        $image = $default_image;
    }
    
  4. ==============================

    4.이것은 원래 질문에 대한 대답이 아니지만 수행하려는 작업을 수행하는 더 좋은 방법입니다.

    이것은 원래 질문에 대한 대답이 아니지만 수행하려는 작업을 수행하는 더 좋은 방법입니다.

    실제로 사이트의 favicon을 직접 가져 오는 대신 (/favicon.png, /favicon.ico, /favicon.gif 또는 /path/to/favicon.png 일 수있는 왕실의 고통) google을 사용하십시오.

    <img src="http://www.google.com/s2/favicons?domain=[domain]">
    

    끝난.

  5. ==============================

    5.이미지를 다루는 경우 getimagesize를 사용하십시오. file_exists와 달리이 내장 함수는 원격 파일을 지원합니다. 이미지 정보 (width, height, type..etc)가 포함 된 배열을 반환합니다. 배열의 첫 번째 요소 (너비)를 확인하기 만하면됩니다. print_r을 사용하여 배열 내용 출력

    이미지를 다루는 경우 getimagesize를 사용하십시오. file_exists와 달리이 내장 함수는 원격 파일을 지원합니다. 이미지 정보 (width, height, type..etc)가 포함 된 배열을 반환합니다. 배열의 첫 번째 요소 (너비)를 확인하기 만하면됩니다. print_r을 사용하여 배열 내용 출력

    $imageArray = getimagesize("http://www.example.com/image.jpg");
    if($imageArray[0])
    {
        echo "it's an image and here is the image's info<br>";
        print_r($imageArray);
    }
    else
    {
        echo "invalid image";
    }
    
  6. ==============================

    6.가장 많이 투표 된 답변의 완전한 기능 :

    가장 많이 투표 된 답변의 완전한 기능 :

    function remote_file_exists($url)
    {
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_NOBODY, true);
        curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        if( $httpCode == 200 ){return true;}
    }
    

    다음과 같이 사용할 수 있습니다.

    if(remote_file_exists($url))
    {
        //file exists, do something
    }
    
  7. ==============================

    7.

    if (false === file_get_contents("http://example.com/path/to/image")) {
        $image = $default_image;
    }
    

    일해야한다;)

  8. ==============================

    8.컨텍스트 옵션을 사용하는 file_get_contentsDocs에서 가능한 HTTP 상태 코드 (404 = 찾을 수 없음)를 가져 와서 수행 할 수 있습니다. 다음 코드는 리디렉션을 고려하여 최종 대상 (Demo)의 상태 코드를 반환합니다.

    컨텍스트 옵션을 사용하는 file_get_contentsDocs에서 가능한 HTTP 상태 코드 (404 = 찾을 수 없음)를 가져 와서 수행 할 수 있습니다. 다음 코드는 리디렉션을 고려하여 최종 대상 (Demo)의 상태 코드를 반환합니다.

    $url = 'http://example.com/';
    $code = FALSE;
    
    $options['http'] = array(
        'method' => "HEAD",
        'ignore_errors' => 1
    );
    
    $body = file_get_contents($url, NULL, stream_context_create($options));
    
    foreach($http_response_header as $header)
        sscanf($header, 'HTTP/%*d.%*d %d', $code);
    
    echo "Status code: $code";
    

    리디렉션을 따르고 싶지 않다면 이와 비슷하게 할 수 있습니다 (데모).

    $url = 'http://example.com/';
    $code = FALSE;
    
    $options['http'] = array(
        'method' => "HEAD",
        'ignore_errors' => 1,
        'max_redirects' => 0
    );
    
    $body = file_get_contents($url, NULL, stream_context_create($options));
    
    sscanf($http_response_header[0], 'HTTP/%*d.%*d %d', $code);
    
    echo "Status code: $code";
    

    사용중인 함수, 옵션 및 변수 중 일부는 필자가 작성한 블로그 게시물 (PHP 스트림의 HEAD)에 대한 자세한 설명과 함께 설명되어 있습니다.

  9. ==============================

    9.보안을 위해 allow_url_fopen 설정이 off로 설정되어 있으면 PHP의 내장 함수가 URL 확인에 작동하지 않을 수 있습니다. Curl은 나중에 코드를 변경할 필요가 없기 때문에 더 좋은 옵션입니다. 다음은 유효한 URL을 확인하는 데 사용한 코드입니다.

    보안을 위해 allow_url_fopen 설정이 off로 설정되어 있으면 PHP의 내장 함수가 URL 확인에 작동하지 않을 수 있습니다. Curl은 나중에 코드를 변경할 필요가 없기 때문에 더 좋은 옵션입니다. 다음은 유효한 URL을 확인하는 데 사용한 코드입니다.

    $url = str_replace(' ', '%20', $url);
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($ch, CURLOPT_NOBODY, true);
    curl_exec($ch);
    $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);  
    curl_close($ch);
    if($httpcode>=200 && $httpcode<300){  return true; } else { return false; } 
    

    URL이 HTTPS로 시작하는지 확인하는 CURLOPT_SSL_VERIFYPEER 옵션도 참고하십시오.

  10. ==============================

    10.급진적 인 해결책은 기본 아이콘 위에있는 div에 배경 이미지로 favicon을 표시하는 것입니다. 이렇게하면 모든 오버 헤드가 클라이언트에 배치되지만 깨진 이미지는 표시되지 않습니다. 누락 된 배경 이미지는 모든 브라우저 AFAIK에서 무시됩니다.

    급진적 인 해결책은 기본 아이콘 위에있는 div에 배경 이미지로 favicon을 표시하는 것입니다. 이렇게하면 모든 오버 헤드가 클라이언트에 배치되지만 깨진 이미지는 표시되지 않습니다. 누락 된 배경 이미지는 모든 브라우저 AFAIK에서 무시됩니다.

  11. ==============================

    11.

    function remote_file_exists($url){
       return(bool)preg_match('~HTTP/1\.\d\s+200\s+OK~', @current(get_headers($url)));
    }  
    $ff = "http://www.emeditor.com/pub/emed32_11.0.5.exe";
        if(remote_file_exists($ff)){
            echo "file exist!";
        }
        else{
            echo "file not exist!!!";
        }
    
  12. ==============================

    12.다음을 사용할 수 있습니다.

    다음을 사용할 수 있습니다.

    $file = 'http://mysite.co.za/images/favicon.ico';
    $file_exists = (@fopen($file, "r")) ? true : false;
    

    URL에 이미지가 있는지 확인하려고 할 때 나를 위해 일했습니다.

  13. ==============================

    13.당신이 사용할 수있는 :

    당신이 사용할 수있는 :

    $url=getimagesize(“http://www.flickr.com/photos/27505599@N07/2564389539/”);
    
    if(!is_array($url))
    {
       $default_image =”…/directoryFolder/junal.jpg”;
    }
    
  14. ==============================

    14.URI 내용을 전혀 필요로하지 않기 때문에, GET 요청이 아닌 HEAD 요청을 발행해야합니다. 파이가 위에서 말했듯이 상태 코드 (200-299 범위, 3xx 리디렉션을 선택적으로 따를 수 있음)를 확인해야합니다.

    URI 내용을 전혀 필요로하지 않기 때문에, GET 요청이 아닌 HEAD 요청을 발행해야합니다. 파이가 위에서 말했듯이 상태 코드 (200-299 범위, 3xx 리디렉션을 선택적으로 따를 수 있음)를 확인해야합니다.

    대답 질문에는 유용한 코드 예제가 많이 있습니다. PHP / Curl : HEAD 요청은 일부 사이트에서 오랜 시간이 걸립니다.

  15. ==============================

    15.더욱 정교한 대안이 있습니다. JQuery 트릭을 사용하여 모든 클라이언트 측에서 검사 할 수 있습니다.

    더욱 정교한 대안이 있습니다. JQuery 트릭을 사용하여 모든 클라이언트 측에서 검사 할 수 있습니다.

    $('a[href^="http://"]').filter(function(){
         return this.hostname && this.hostname !== location.hostname;
    }).each(function() {
        var link = jQuery(this);
        var faviconURL =
          link.attr('href').replace(/^(http:\/\/[^\/]+).*$/, '$1')+'/favicon.ico';
        var faviconIMG = jQuery('<img src="favicon.png" alt="" />')['appendTo'](link);
        var extImg = new Image();
        extImg.src = faviconURL;
        if (extImg.complete)
          faviconIMG.attr('src', faviconURL);
        else
          extImg.onload = function() { faviconIMG.attr('src', faviconURL); };
    });
    

    http://snipplr.com/view/18782/add-a-favicon-near-external-links-with-jquery/ (원본 블로그는 현재 다운 됨)

  16. ==============================

    16.get_headers ()를 사용하는 모든 대답은 GET 요청을 수행합니다. HEAD 요청 만하는 것이 훨씬 빠르고 저렴합니다.

    get_headers ()를 사용하는 모든 대답은 GET 요청을 수행합니다. HEAD 요청 만하는 것이 훨씬 빠르고 저렴합니다.

    get_headers ()가 GET 대신 HEAD 요청을하는지 확인하려면 다음을 추가해야합니다.

    stream_context_set_default(
        array(
            'http' => array(
                'method' => 'HEAD'
            )
        )
    );
    

    따라서 파일이 존재하는지 확인하려면 코드가 다음과 같이 보일 것입니다.

    stream_context_set_default(
        array(
            'http' => array(
                'method' => 'HEAD'
            )
        )
    );
    $headers = get_headers('http://website.com/dir/file.jpg', 1);
    $file_found = stristr($headers[0], '200');
    

    $ file_found는 false 또는 true를 반환합니다.

  17. ==============================

    17.이미지의 존재 여부를 확인하려면 exim_imagetype이 getimagesize보다 우선되어야합니다. 훨씬 빠릅니다.

    이미지의 존재 여부를 확인하려면 exim_imagetype이 getimagesize보다 우선되어야합니다. 훨씬 빠릅니다.

    E_NOTICE를 억제하려면 에러 제어 연산자 (@)를 앞에 붙이면됩니다.

    if (@exif_imagetype($filename)) {
      // Image exist
    }
    

    보너스로 exif_imagetype에서 반환 된 값 (IMAGETYPE_XXX)을 사용하여 image_type_to_mime_type / image_type_to_extension을 사용하여 mime-type 또는 file-extension을 얻을 수도 있습니다.

  18. ==============================

    18.PHP에 원격 파일이 있는지 확인하는 방법은 다음과 같습니다.

    PHP에 원격 파일이 있는지 확인하는 방법은 다음과 같습니다.

    $url = 'https://cdn.sstatic.net/Sites/stackoverflow/img/favicon.ico';
        $header_response = get_headers($url, 1);
    
        if ( strpos( $header_response[0], "404" ) !== false ) {
            echo 'File does NOT exist';
            } else {
            echo 'File exists';
            }
    
  19. ==============================

    19.이 파일이 원격으로 존재하지 않는 경우 is_file ()이 더 빠를 지 모르겠지만 한 번만 제공 할 수 있습니다.

    이 파일이 원격으로 존재하지 않는 경우 is_file ()이 더 빠를 지 모르겠지만 한 번만 제공 할 수 있습니다.

    $favIcon = 'default FavIcon';
    if(is_file($remotePath)) {
       $favIcon = file_get_contents($remotePath);
    }
    
  20. from https://stackoverflow.com/questions/981954/how-can-one-check-to-see-if-a-remote-file-exists-using-php by cc-by-sa and MIT license