ハマログ

株式会社イーツー・インフォの社員ブログ

PHPのfile_get_contentsでエラーハンドリングする

PHPのfile_get_contents関数で、サーバ上のファイルを読み込むことができますが、HTTP(or HTTPS)で参照できるコンテンツも取得することができます。
本当は、curlで書いたほうがいいですけどね。
$ret = file_get_contents($url);
if (!$ret) {
    throw new Exception("error");
}
さて、上記のコードとした場合、接続先から200以外のステータスコードが返ってきた場合やタイムアウト接続できなかった場合でも、warningエラーを出力して、後続の処理が継続されてしまいます。
単純な制御の場合は、この実装でよいのですが、エラー時のリトライや細かいエラーハンドリング、ステータスコードで処理をわけたい場合などは、以下のように処理を実装する必要があります。
$contextOptions = array(
    'http' => array(
        "ignore_errors" => true,
    )
);
$context = stream_context_create($contextOptions);

$http_response_header = array();
$ret = file_get_contents($url, false, $context);
if(empty(http_response_header)){
    throw new Exception("error. response header is empty");
}

preg_match('/HTTP\/1\.[0|1|x] ([0-9]{3})/', $http_response_header[0], $matches);
$statusCode = $matches[1];
    
if ($statusCode !== "200") {
    throw new Exception("error. status code:" . statusCode);
}
if (!$ret) {
    throw new Exception("error. response is empty");
}
// process

これで、200以外の戻り値の場合、例外として処理できるようになりました。

contextを作成する際に、ignore_errorsパラメータを指定することで、内部ではエラーを無視して、http_response_headerという名前の変数に、ヘッダー情報を設定する動作となります。

$http_response_headerは使いまわされる(ループ処理する場合などに、前の結果が残ってしまう)ため、file_get_contentsを実行する前に初期化しておいたほうが安全です。

変数にセットされるエラー内容はこんな感じです。
(
    [0] => HTTP/1.1 403 Forbidden
    [1] => Content-Type: text/html; charset=iso-8859-1
    [2] => Date: Sat, 13 May 2017 12:59:58 GMT
    [3] => Server: Apache
    [4] => Vary: Accept-Encoding
    [5] => Content-Length: 293
    [6] => Connection: Close
)
以上
200404500ErrorExceptionfile_get_contentsPHPエラーキャッチステータスコードハンドリング例外

  kaneko tomo   2017年5月13日


関連記事

NetbeansのFormatをPSRに準拠させる

こんにちは、かねこです。 いま挑戦しているPHPのプロジェクトで、NetBean…

iptablesのログを出力して確認する方法

仕事でiptablesのログを出して調査する機会がありました。 過去何回か同じよ…

Windows PowerShellの文字コードを変更する(コマンドプロンプトも)

Windows7以降標準で搭載されているWindows PowerShellを従…


← 前の投稿

次の投稿 →