PHP에서 file_get_contents () 함수의 경고를 어떻게 처리 할 수 ​​있습니까?


312

나는 이런 PHP 코드를 썼다

$site="http://www.google.com";
$content = file_get_content($site);
echo $content;

그러나 "http : //"를 제거 $site하면 다음 경고가 표시됩니다.

경고 : file_get_contents (www.google.com) [function.file-get-contents] : 스트림을 열지 못했습니다 :

나는 시도 try하고 catch있지만 작동하지 않았다.


2
또한 흥미로운 접근 방식 : stackoverflow.com/questions/6718598/...
휴고 스티글리츠


set_error_handler 기능과 사용의 시도 - 캐치는 여기에 말했듯이 stackoverflow.com/a/3406181/1046909
MingalevME

2
URL에서 http : //를 제거하면 로컬 디스크에서 "www.google.com"파일을 찾고있는 것입니다.
Rauli Rajande

어떻게 그렇게 많은 관심과 공감을 얻을 수 있습니까? 프로토콜 정보를 왜 제거 하시겠습니까? 2008 년에도 FTP와 HTTPS가있었습니다.
Daniel W.

답변:


507

1 단계 : 리턴 코드 확인 if($content === FALSE) { // handle error here... }

2 단계 : file_get_contents () 호출 앞에 오류 제어 연산자 (예 :) 를 넣어 경고를 표시하지 않습니다 . @$content = @file_get_contents($site);


86
엄격한 비교를 사용하는 것을 잊지 마십시오 : if ($ content === FALSE). 파일에 "0"이 포함되어 있으면 거짓 부정을 트리거합니다.
Aram Kocharyan 2016 년

7
안녕하세요, 이것은 나를 위해 작동하지 않았습니다. @를 계속 추가하면 E_WARNING이 전역 오류가 아닌 전역 오류 처리기에 의해 잡히고 반환 값을 처리하기 전에 스크립트가 종료됩니다. 어떤 아이디어? tnx.
Sagi Mann

1
부작용 감지 : 파일이 존재하지 않으면 스크립트는 @file_get_contents 줄에서 멈 춥니 다.
Dax

이것이 올바른 해결책이 되더라도 나에게는 효과가 없습니다. 데이터가 수신되지 않은 시간 초과 경고가 있지만 $ content === FALSE가 "트리거되지 않습니다"($ site가 로컬 호스트 서버에서 호출됩니다. URL을 브라우저에 붙여 넣으면 데이터가 빠르게 있음에 유의하십시오).
Oliver

4
답변은 매우 오래되었지만 여전히 사용하면 @성능에 부정적인 영향을 줄 수 있다는 메모를 추가하는 것이 좋습니다 . 상당히 잘 설명 된 관련 게시물 에서이 답변 을 참조하십시오 .
Fr0zenFyr

148

오류 처리기예외 를 호출하고 해당 예외에 대해 try / catch를 사용 하는 익명 함수설정할 수도 있습니다 .

set_error_handler(
    function ($severity, $message, $file, $line) {
        throw new ErrorException($message, $severity, $severity, $file, $line);
    }
);

try {
    file_get_contents('www.google.com');
}
catch (Exception $e) {
    echo $e->getMessage();
}

restore_error_handler();

하나의 작은 오류를 포착하는 많은 코드처럼 보이지만 앱 전체에서 예외를 사용하는 경우 맨 위에 (예를 들어 포함 된 구성 파일)이 작업을 한 번만 수행하면됩니다. 전체적으로 모든 오류를 예외로 변환하십시오.


지금까지 내가 본 것 중 가장 큰 PHP 개선 중 하나입니다. 감사합니다 enobrev
Tomasz Smykowski

@enobrev, 왜 오류 번호와 심각도에 같은 값을 넣습니까?
Pacerier

set_error_handler는 (불행히도) 오류 번호 변수를 제공하지 않기 때문에 $ exception-> getCode ()에 유용한 것을 제공하는 수단 외에 특별한 이유가 없습니다.
enobrev

1
@enobrev 예외를 처리하기 전에 익명 함수 내에서 오류 처리기를 복원하는 것을 잊지 마십시오. 예외를 처리 할 수 ​​있으며이 경우 처리기는 예외 처리로 인해 예외가 발생하여 예외 처리에 다른 오류가있을 때 이상하고 디버그하기 어려운 동작을 유발할 수있는이 특정 예외를 처리하도록 여전히 설정되어 있습니다.
Josef Sábl

1
finally 블록에 restore_error_handler () 호출을 포함시키는 것이 좋습니다
peschanko

67

가장 좋아하는 방법은 매우 간단합니다.

if (!$data = file_get_contents("http://www.google.com")) {
      $error = error_get_last();
      echo "HTTP request failed. Error was: " . $error['message'];
} else {
      echo "Everything went better than expected";
}

try/catch위의 @enobrev를 실험 한 후에 이것을 찾았 지만 더 길고 (더 읽기 쉬운 IMO) 코드를 허용합니다. 우리는 단순히 error_get_last마지막 오류의 텍스트를 얻기 위해 사용 하고 file_get_contents실패시 false를 반환하므로 간단한 "if"가이를 잡을 수 있습니다.


2
이것이이 문제에 대한 가장 쉽고 최상의 솔루션입니다! 어쩌면 그것은 수 있도록 @file_get_contents브라우저에 오류보고를이 표시되지 않도록.
EDP

1
우리가 사용하도록 증대 줄 경우 - 나는 모든 해답 중이 유일한 현명한 일이라고 인정 @file_get_contents경고를 억제 하고 사용하여 결과 값을 테스트 === FALSE.
kostix

11
이렇게하면 본문을 반환하지 않거나 잘못된 것으로 평가 된 요청을 반환하는 성공적인 요청에 대해 오류가 발생합니다. 이어야한다if (false !== ($data = file_get_contents ()))
GordonM

이 문서는 명확하지 않지만 @을 사용하면 error_get_last내 경험에 아무것도 반환되지 않을 수 있습니다.
Glenn Schmidt

33

@를 앞에 붙일 수 있습니다 : $content = @file_get_contents($site);

경고가 표시 되지 않습니다. . 오류 제어 연산자 참조

편집 : 'http : //'를 제거하면 더 이상 웹 페이지가 아니라 디스크에 "www.google ....."이라는 파일이 나타납니다.


이것이 실제로 작동하는 유일한 방법입니다. 다른 방법으로는 "스트림을 열지 못했습니다"라는 메시지를 표시 할 수 없습니다.
올라프

21

한 가지 대안은 오류를 억제하고 나중에 포착 할 수있는 예외를 발생시키는 것입니다. 이것은 코드에서 file_get_contents ()를 여러 번 호출하는 경우 특히 유용합니다. 수동으로 모든 것을 억제하고 처리 할 필요가 없기 때문입니다. 대신, 단일 try / catch 블록에서이 기능을 여러 번 호출 할 수 있습니다.

// Returns the contents of a file
function file_contents($path) {
    $str = @file_get_contents($path);
    if ($str === FALSE) {
        throw new Exception("Cannot access '$path' to read contents.");
    } else {
        return $str;
    }
}

// Example
try {
    file_contents("a");
    file_contents("b");
    file_contents("c");
} catch (Exception $e) {
    // Deal with it.
    echo "Error: " , $e->getMessage();
}

15

여기에 내가 한 방법이 있습니다 ... try-catch 블록이 필요하지 않습니다 ... 가장 좋은 솔루션은 항상 가장 간단합니다 ... 즐기십시오!

$content = @file_get_contents("http://www.google.com");
if (strpos($http_response_header[0], "200")) { 
   echo "SUCCESS";
} else { 
   echo "FAILED";
} 

4
-1 : 404 오류가 발생하거나 서버에 전혀 연결하지 못한 경우 (예 : 잘못된 도메인 이름) 작동하지 않습니다. 내 생각 $http_response_header에는 HTTP 응답이 수신되지 않기 때문에,이 경우에 업데이트되지 않습니다.
Nathan Reed

1
@NathanReed가 말했듯이 $ content가 false가 아닌지 확인해야합니다 (===로) 요청이 전혀 연결되지 않으면 반환되는 것이므로
Seb

15
function custom_file_get_contents($url) {
    return file_get_contents(
        $url,
        false,
        stream_context_create(
            array(
                'http' => array(
                    'ignore_errors' => true
                )
            )
        )
    );
}

$content=FALSE;

if($content=custom_file_get_contents($url)) {
    //play with the result
} else {
    //handle the error
}

작동하지 않습니다. (가) 경우 $url를 찾을 수 없습니다 404, 경고가 계속 나타납니다.
랩터

오른쪽 랩터, stream_context_create (); 더 좋은 점은 없습니다 ... "@"권장하지 않음
RafaSashi

1
ignore_errorsHTTP 응답 상태 코드> = 400을 오류로 해석하지 않도록 HTTP 컨텍스트에만 지시합니다 . 약간 관련되어 있지만 PHP 오류 처리 문제에 대한 답변은 아닙니다.
sun

ignore_errors옵션 주셔서 감사합니다 ! 이것이 내가 필요한 것입니다!
Modder

6

내가 처리하는 방법은 다음과 같습니다.

$this->response_body = @file_get_contents($this->url, false, $context);
if ($this->response_body === false) {
    $error = error_get_last();
    $error = explode(': ', $error['message']);
    $error = trim($error[2]) . PHP_EOL;
    fprintf(STDERR, 'Error: '. $error);
    die();
}

4

가장 좋은 방법은 파일에 기록하거나 중요한 파일을 전자 메일로 보내는 것과 같은 유용한 작업을 수행하는 자체 오류 및 예외 처리기를 설정하는 것입니다. http://www.php.net/set_error_handler


1

이 스크립트를 사용할 수 있습니다

$url = @file_get_contents("http://www.itreb.info");
if ($url) {
    // if url is true execute this 
    echo $url;
} else {
    // if not exceute this 
    echo "connection error";
}

if ($url === true)...응답을 얻 0거나 비우면 연결 오류가 발생 하기 때문에 엄격한 비교가 필요 합니다.
Daniel W.

1

PHP 4는 error_reporting ()을 사용하므로 :

$site="http://www.google.com";
$old_error_reporting = error_reporting(E_ALL ^ E_WARNING);
$content = file_get_content($site);
error_reporting($old_error_reporting);
if ($content === FALSE) {
    echo "Error getting '$site'";
} else {
    echo $content;
}


1

이 같은:

public function get($curl,$options){
    $context = stream_context_create($options);
    $file = @file_get_contents($curl, false, $context);
    $str1=$str2=$status=null;
    sscanf($http_response_header[0] ,'%s %d %s', $str1,$status, $str2);
    if($status==200)
        return $file        
    else 
        throw new \Exception($http_response_header[0]);
}

1
if (!file_get_contents($data)) {
  exit('<h1>ERROR MESSAGE</h1>');
} else {
      return file_get_contents($data);
}

-2

file_get_contents ()를 사용하기 전에 file_exists () 함수를 사용해야합니다. 이 방법으로 PHP 경고를 피할 수 있습니다.

$file = "path/to/file";

if(file_exists($file)){
  $content = file_get_contents($file);
}

로컬 파일을 호출하고 로컬 파일이 있는지 확인하는 올바른 권한이있는 경우에만 작동합니다
rubo77

-3

php.ini 파일을 변경하십시오

allow_url_fopen = On

allow_url_include = On

이러지 마 특히 URL 포함을 허용하지 마십시오. 믿지마 # c99와 같은 이유로 기본적으로 비활성화되어 있습니다.
Daniel W.

-3

데이터가 작동하지 않으면 데이터를 가져 오려고 시도합니다. 오류가 발생하면 캐치 내에서 필요한 모든 작업을 수행 할 수 있습니다.

try {
    $content = file_get_contents($site);
} catch(\Exception $e) {
    return 'The file was not found';
}

-3
try {
   $site="http://www.google.com";
   $content = file_get_content($site);
   echo $content;
} catch (ErrorException $e) {
    // fix the url

}

set_error_handler(function ($errorNumber, $errorText, $errorFile,$errorLine ) 
{
    throw new ErrorException($errorText, 0, $errorNumber, $errorFile, $errorLine);
});

file_get_content가 항상 예외를 던지는 것은 아닙니다
marlar 16.17

답변을 수정하고 file_get_content가 언제 예외를 발생시키는 지 알려주시겠습니까?
Ravinder Payal

1
이 코드는 질문에 대답 할 수 있지만,이 코드가 질문에 응답하는 이유 및 / 또는 방법에 대한 추가 컨텍스트를 제공하면 장기적인 가치가 향상됩니다.
Jay Blanchard

-3

또한 설정해야합니다

allow_url_use = On 

php.ini경고 수신을 중지 하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.