programing

PHP를 사용하여 리모트파일이 존재하는지 확인하려면 어떻게 해야 합니까?

newsource 2022. 11. 16. 21:16

PHP를 사용하여 리모트파일이 존재하는지 확인하려면 어떻게 해야 합니까?

내가 찾을 수 있는 최선은if fclose fopen이치노

기본적으로 제가 하려는 일은 다음과 같습니다.웹사이트 목록을 가지고 있는데, 그 웹사이트 옆에 즐겨찾기를 표시하고 싶습니다.단, 사이트에 없는 경우는 파손된 이미지를 표시하는 것보다 다른 이미지로 교환하고 싶습니다.

CURLOPT_NOBDY를 통해 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);

어쨌든, HTTP 전송의 코스트만을 절약할 수 있습니다.TCP 접속의 확립과 폐기는 절약할 수 없습니다.그리고 좋아하는 것이 작기 때문에, 별로 개선되지 않을 수도 있습니다.

결과가 너무 느릴 경우 결과를 로컬로 캐싱하는 것이 좋습니다.HEAD는 파일 시간을 확인하고 헤더로 반환합니다.브라우저를 좋아하면 아이콘의 CURLINFO_FILETIME을 얻을 수 있습니다.캐시에 URL = > [ favicon , timestamp ]를 저장할 수 있습니다.그런 다음 타임스탬프를 비교하여 favicon을 새로고침할 수 있습니다.

Pies에서 말하는 것처럼 cURL을 사용할 수 있습니다.cURL을 취득하면 본문이 아닌 헤더만 취득할 수 있기 때문에 본문이 표시되지 않습니다.부정한 도메인은 요구가 타임아웃 될 때까지 대기하기 때문에 항상 시간이 걸릴 수 있습니다.아마 cURL을 사용하여 타임아웃 길이를 변경할 수 있습니다.

다음은 예를 제시하겠습니다.

function remoteFileExists($url) {
    $curl = curl_init($url);

    //don't fetch the actual page, you only want to check the connection is ok
    curl_setopt($curl, CURLOPT_NOBODY, true);

    //do request
    $result = curl_exec($curl);

    $ret = false;

    //if request did not fail
    if ($result !== false) {
        //if request was ok, check response code
        $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 'file exists';
} else {
    echo 'file does not exist';   
}

CoolGoose의 솔루션은 좋지만 큰 파일(읽기 1바이트만 시도하므로)이 더 빠릅니다.

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

이것은, 당초의 질문에의 회답이 아니고, 보다 좋은 방법으로 실시합니다.

실제로 사이트의 favicon을 직접 취득하려고 하지 않고(이는 왕실의 문제일 수 있습니다), 구글을 사용합니다.

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

다 했어요.

가장 많이 투표된 답변의 전체 함수:

function remote_file_exists($url)
{
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_NOBODY, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); # handles 301/2 redirects
    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
}

이미지를 다루는 경우 getimagesize를 사용합니다.file_exists와 달리 이 빌트인 함수는 원격 파일을 지원합니다.이미지 정보(폭, 높이, 유형 등)를 포함한 어레이가 반환됩니다.배열의 첫 번째 요소(폭)를 확인하기만 하면 됩니다.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";
}
if (false === file_get_contents("http://example.com/path/to/image")) {
    $image = $default_image;
}

동작해야 한다;)

이는 컨텍스트 옵션을 사용하여 가능한 HTTP 상태 코드(404 = not found)를 얻음으로써 수행할 수 있습니다.다음 코드는 리다이렉트를 고려하여 최종 수신처의 상태 코드(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";

사용 중인 함수, 옵션 및 변수 중 일부는 블로그 포스트에 자세히 설명되어 있습니다: HEAD first with PHP Streams.

보안상의 이유로 allow_url_fopen 설정이 off로 설정되어 있는 경우, PHP의 빌트 함수는 URL 체크에 기능하지 않을 수 있습니다.나중에 코드를 변경할 필요가 없기 때문에 컬이 더 좋습니다.유효한 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 옵션에 주의해 주세요.

이미지의 존재를 확인하려면 , 가 훨씬 빠르기 때문에, 보다 우선합니다.

를 억제하려면 , 에러 제어 연산자를 선두에 추가합니다( ).@를 참조해 주세요.

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

보너스로서, 반환된 값과 함께)IMAGETYPE_XXX부터의 설명exif_imagetype MIME을 사용하여 또는 수도 .image_type_to_mime_typeimage_type_to_extension.

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

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

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

URL에 이미지가 있는지 확인하려고 할 때 도움이 되었습니다.

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!!!";
    }

리모트 파일이 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';
        }

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

$url=getimagesize(“http://www.flickr.com/photos/27505599@N07/2564389539/”);

if(!is_array($url))
{
   $default_image =”…/directoryFolder/junal.jpg”;
}

URI 콘텐츠는 전혀 필요 없기 때문에 GET이 아닌 HEAD 요구를 발행해야 합니다.Pies가 위에서 설명한 바와 같이 상태 코드를 확인해야 합니다(200~299 범위, 임의로 3xx 방향 수정에 따를 수 있습니다).

답변 질문에는 많은 코드 예가 포함되어 있어 도움이 될 수 있습니다.PHP / Curl : HEAD Request는 일부 사이트에서 시간이 오래 걸립니다.

더 정교한 대안이 있습니다.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/ 에서 (원래 블로그는 현재 다운되었습니다)

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 중 하나를 반환합니다.

파일이 외부에서 호스트되지 않은 경우 원격 URL을 웹 서버상의 절대 경로로 변환할 수 있습니다.그러면 CURL이나 file_get_contents 등을 호출할 필요가 없습니다.

function remoteFileExists($url) {

    $root = realpath($_SERVER["DOCUMENT_ROOT"]);
    $urlParts = parse_url( $url );

    if ( !isset( $urlParts['path'] ) )
        return false;

    if ( is_file( $root . $urlParts['path'] ) )
        return true;
    else
        return false;

}

remoteFileExists( 'https://www.yourdomain.com/path/to/remote/image.png' );

참고: 이 함수를 사용하려면 웹 서버가 DOCUMENT_ROOT를 채워야 합니다.

Laravel 프레임워크 또는 guzzle 패키지를 사용하는 경우, guzle 클라이언트를 사용하는 훨씬 더 간단한 방법도 있습니다.또, 링크가 리다이렉트 되었을 때에도 동작합니다.

$client = new \GuzzleHttp\Client(['allow_redirects' => ['track_redirects' => true]]);
try {
    $response = $client->request('GET', 'your/url');
    if ($response->getStatusCode() != 200) {
        // not exists
    }
} catch (\GuzzleHttp\Exception\GuzzleException $e) {
    // not exists
}

문서 상세: https://docs.guzzlephp.org/en/latest/faq.html#how-can-i-track-redirected-requests

is_file() 파일이 원격으로 존재하지 않을 때 이 파일이 더 빠른지 알 수 없지만 시도해 볼 수 있습니다.

$favIcon = 'default FavIcon';
if(is_file($remotePath)) {
   $favIcon = file_get_contents($remotePath);
}

Symfony 프레임워크를 사용하는 경우 보다 간단한 방법으로HttpClientInterface:

private function remoteFileExists(string $url, HttpClientInterface $client): bool {
    $response = $client->request(
        'GET',
        $url //e.g. http://example.com/file.txt
    );

    return $response->getStatusCode() == 200;
}

HttpClient용 문서도 매우 유용하며, 보다 구체적인 접근법이 필요한 경우 https://symfony.com/doc/current/http_client.html에서 확인할 수 있습니다.

파일 시스템을 사용할 수 있습니다.Symfony\Component\파일 시스템\파일 시스템: Symfony\Component\를 사용합니다.파일 시스템\예외 \IOException(IOException)인터페이스

$fileSystem = new Filesystem()을 확인합니다.$fileSystem-> exists('path_to_file')인 경우==참) {...

이 URL을 확인하시면 도움이 될 것 같습니다.그들은 약간의 설명과 함께 이것을 극복하는 두 가지 방법을 제공한다.

이거 드셔보세요.

// Remote file url
$remoteFile = 'https://www.example.com/files/project.zip';

// Initialize cURL
$ch = curl_init($remoteFile);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_exec($ch);
$responseCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

// Check the response code
if($responseCode == 200){
    echo 'File exists';
}else{
    echo 'File not found';
}

또는 URL을 방문하십시오.

https://www.codexworld.com/how-to/check-if-remote-file-exists-url-php/ #:~:text=%20file_exists()%20function%20in,a%20remote%20server%20PHP사용.

언급URL : https://stackoverflow.com/questions/981954/how-can-one-check-to-see-if-a-remote-file-exists-using-php