내가 찾을 수있는 최선의 if
fclose
fopen
유형은 페이지로드를 정말 느리게 만듭니다.
기본적으로 내가하려는 것은 다음과 같습니다. 웹 사이트 목록이 있고 그 옆에 파비콘을 표시하고 싶습니다. 그러나 사이트에없는 경우 깨진 이미지를 표시하는 대신 다른 이미지로 교체하고 싶습니다.
답변
curl에 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 전송 비용 만 절약됩니다. 그리고 파비콘이 작기 때문에 많은 개선을 보지 못할 수도 있습니다.
결과를 로컬로 캐싱하는 것이 너무 느린 것으로 판명되면 좋은 생각으로 보입니다. HEAD는 파일의 시간을 확인하고 헤더에 반환합니다. 당신은 브라우저처럼 할 수 있고 아이콘의 CURLINFO_FILETIME을 얻을 수 있습니다. 캐시에 URL => [favicon, timestamp]를 저장할 수 있습니다. 그런 다음 타임 스탬프를 비교하고 파비콘을 다시로드 할 수 있습니다.
답변
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을 직접 가져 오려고하는 대신 (/favicon.png, /favicon.ico, /favicon.gif 또는 /path/to/favicon.png 일 수 있다는 점을 감안하면 왕실의 고통입니다) google을 사용하세요.
<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";
}
답변
이는 file_get_contents
문서 에서 컨텍스트 옵션을 사용하여 가능한 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";
사용중인 일부 함수, 옵션 및 변수는 내가 작성한 블로그 게시물에 자세히 설명되어 있습니다. HEAD first with PHP Streams .