web-dev-qa-db-ja.com

PHPでfile_get_contents()関数の警告を処理するにはどうすればいいですか?

私はこのようなPHPコードを書きました

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

$siteから "http://"を削除すると、次のような警告が表示されます。

警告:file_get_contents(www.google.com)[function.file-get-contents]:ストリームを開けませんでした:

trycatchを試しましたが、うまくいきませんでした。

280
Waseem

ステップ1:戻りコードを確認します。if($content === FALSE) { // handle error here... }

ステップ2:file_get_contents()への呼び出しの前に エラー制御演算子 (つまり@)を入れることで警告を抑制します$content = @file_get_contents($site);

459
Roel

エラーハンドラを設定無名関数 として Exception を呼び出し、その例外に対して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();

ちょっとしたエラーを捕らえるにはたくさんのコードのように思えますが、もしあなたがあなたのアプリケーション全体で例外を使っているのなら、(例えば含まれている設定ファイルで)一度だけこれをする必要があるでしょう。全体のエラーをすべて例外に変換してください。

129
enobrev

これを行う私のお気に入りの方法はかなり簡単です:

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

私は上記の@enobrevからのtry/catchを試した後にこれを見つけました、しかしこれはより短い(そしてIMO、もっと読みやすい)コードを可能にします。最後のエラーのテキストを取得するには単にerror_get_lastを使用します。失敗した場合はfile_get_contentsはfalseを返すので、単純な "if"でそれを検出できます。

60
Laurie

@を前に付けることができます:$content = @file_get_contents($site);

これは警告を抑制します - 控えめに使用してください。エラー制御演算子 を参照してください。

編集:あなたが「http://」を削除するとき、あなたはもうウェブページを探していません、しかしあなたのディスク上の「www.google .....」と呼ばれるファイル

31
Greg

1つの方法は、エラーを抑制し、後でキャッチできる例外をスローすることです。コード内で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();
}
18
Aram Kocharyan
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
}
13
RafaSashi

これが私のやり方です…try-catchブロックの必要はありません...最善の解決策は常に最も簡単です...お楽しみください!

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

これを私がどのように処理するのかです:

$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();
}
6
Jrm

最良のことはあなた自身のエラーと例外ハンドラを設定することです。それはファイルにそれを記録するか重要なものに電子メールを送ることのような何か有用なことをするでしょう。 http://www.php.net/set_error_handler

3
Arkh

あなたはこのスクリプトを使うことができます

$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";
}
1
ogie

これを行う最も簡単な方法は、file_get_contentsの前に@を付けるだけです。 e .:

$content = @file_get_contents($site); 

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
Bob Stein

このようなもの:

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]);
}
0
Michael de Oz