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_type
image_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
'programing' 카테고리의 다른 글
VueJ: @keydown, @keyup, 그리고 이것.$refs는 입력에서는 동작하지만 md-text area에서는 동작하지 않습니다. (0) | 2022.11.16 |
---|---|
Symfony2 응용 프로그램의 루트 dir를 얻는 방법 (0) | 2022.11.16 |
MySQL 메모리 사용량 최대 100% 증가 (0) | 2022.11.16 |
유효한 Java의 Builder 패턴 (0) | 2022.11.07 |
JavaScript 변수가 정의되어 있지 않은지 확인하는 방법 (0) | 2022.11.07 |