プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
PHP、file_get_contents()関数で引数にURLを指定した際の、HTTPステータスコードを取得する
結論から書くと、変数

$http_response_header[0]

の中身を見ると、HTTPステータスコードが分かります。
配列

$http_response_header

にHTTPレスポンスヘッダが入っていて

$http_response_header[0]

にHTTPステータスコードが

"HTTP/1.0 200 OK"

のような形で入っていますよ。

ただし、存在しないドメイン名を指定した場合は「$http_response_header」が「NULL」になります。
ご注意ください。


それでは、詳細を書いていきます。

file_get_contents()関数を使って、Webページの中身を取得していたのですけどね。
存在しないページのURLを指定したり(404エラーになる場合)
BASIC認証がかかったページのURLを指定したり(401エラーになる場合)すると
falseが返ってきます。

まぁ、ページが取得できませんからね。
それ自体は問題無いのですが、失敗した原因(HTTPステータスコード)を知りたかったのです。

どうやるの(--?
Google先生、教えてけろ。

ふむふむ(--)

なるほど!

URLを指定してfile_get_contents()関数を実行すると、配列

$http_response_header

にHTTPレスポンスヘッダが入ってくるようです。

例えば、こんなコードを実行したところφ(--)

<?php

$url = "http://example.com";
$ret = @file_get_contents($url);

var_dump($http_response_header);

こんな結果が表示されましたφ(--)

array(14) {
  [0]=>
  string(15) "HTTP/1.0 200 OK"
  [1]=>
  string(20) "Accept-Ranges: bytes"
  [2]=>
  string(29) "Cache-Control: max-age=604800"
  [3]=>
  string(23) "Content-Type: text/html"
  [4]=>
  string(35) "Date: Thu, 23 Jun 2016 03:24:55 GMT"
  [5]=>
  string(22) "Etag: "359670651+gzip""
  [6]=>
  string(38) "Expires: Thu, 30 Jun 2016 03:24:55 GMT"
  [7]=>
  string(44) "Last-Modified: Fri, 09 Aug 2013 23:54:35 GMT"
  [8]=>
  string(22) "Server: ECS (cpm/F9D5)"
  [9]=>
  string(21) "Vary: Accept-Encoding"
  [10]=>
  string(12) "X-Cache: HIT"
  [11]=>
  string(20) "x-ec-custom-error: 1"
  [12]=>
  string(20) "Content-Length: 1270"
  [13]=>
  string(17) "Connection: close"
}

最初の要素が

[0]=>
string(15) "HTTP/1.0 200 OK"

になっていますね。
ということは

$http_response_header[0]

を指定すれば、HTTPステータスコードが取得できるようです。

あと、ついでなので数字の部分だけ抜き出すようにしましょうか。
やり方はいろいろあるでしょうが、かっこいいやり方を考えるのが面倒くさいので、単純に

1.半角スペースで分割
2.2番目の要素を取得

にしますね。

ほんで、できあがったのが、こんなコードですφ(--)

<?php

$url = "http://example.com";
$ret = @file_get_contents($url);

print "HTTPステータスコード:" . explode(' ',$http_response_header[0], 3)[1];

実行すると、こんな結果が表示されますφ(--)

HTTPステータスコード:200

なお

print "HTTPステータスコード:" . explode(' ',$http_response_header[0], 3)[1];



$ary = explode(' ',$http_response_header[0], 3);
print "HTTPステータスコード:" . $ary[1];

を1行で書いたものです。
横着して、ごめんなさい。

取りあえず、これでHTTPステータスコードが取得できましたね。

そんな感じ\(--)/


……と終わらせたいのですが、1つ大事な注意点があります。
それは

存在しないドメイン名を指定すると「$http_response_header」が「NULL」になる

ことです。

例えば、これを実行するとφ(--)

<?php

$url = "http://example.com/tekitou";
$ret = @file_get_contents($url);

var_dump($http_response_header);

こんな結果になりますがφ(--)

array(13) {
  [0]=>
  string(22) "HTTP/1.0 404 Not Found"
  [1]=>
  string(29) "Cache-Control: max-age=604800"
  [2]=>
  string(23) "Content-Type: text/html"
  [3]=>
  string(35) "Date: Thu, 23 Jun 2016 03:37:50 GMT"
  [4]=>
  string(28) "Etag: "359670651+gzip+ident""
  [5]=>
  string(38) "Expires: Thu, 30 Jun 2016 03:37:50 GMT"
  [6]=>
  string(44) "Last-Modified: Fri, 09 Aug 2013 23:54:35 GMT"
  [7]=>
  string(22) "Server: ECS (cpm/F9B3)"
  [8]=>
  string(21) "Vary: Accept-Encoding"
  [9]=>
  string(12) "X-Cache: HIT"
  [10]=>
  string(20) "x-ec-custom-error: 1"
  [11]=>
  string(20) "Content-Length: 1270"
  [12]=>
  string(17) "Connection: close"
}

こっちを実行するとφ(--)

<?php

$url = "http://aaaaaaaaaaaaaaaaexample.com/";
$ret = @file_get_contents($url);

var_dump($http_response_header);

こんな結果になりますφ(--)

NULL

きっと、Webページの取得ではなく、ファイルの取得と判断されるのでしょうね。
NULLの場合にどんな処理をするかは自由ですが、いずれにせよ考慮してあげてください。
個人的には、$http_response_headerがNULLだったら404エラー扱いでもいいかな~と思います。

今度こそ、そんな感じ\(--)/
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:● PHP  thema:システム開発 - genre:コンピュータ  Posted by ササキマコト 

  関連記事