プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
PHP、URLの存在チェックを行うついでに「get_headers()」関数で遊んでみる。
PHPでURLの存在チェックをやろうと思いましてね。
Google先生で探してみたところ「fopen()」を使うやり方、「file_get_contents()」を使うやり方、
そして「get_headers()」を使うやり方が主流っぽいということが分かりました。

ちなみに、それぞれの関数を使ったURL存在チェックのやり方はこんな感じねφ(--)

■fopen()を使ったやり方
<?php
//対象URL
$url = "http://i-3-i.info/";

$fp = @fopen($url, 'r');

if($fp){
    print "URL有るよ";
    fclose($fp);
}else{
    print "URL無いよ";
}

■file_get_contents()を使ったやり方
<?php
//対象URL
$url = "http://i-3-i.info/";

$contents = @file_get_contents($url);

if($contents){
    print "URL有るよ";
}else{
    print "URL無いよ";
}

■get_headers()を使ったやり方
<?php
//対象URL
$url = "http://i-3-i.info/";

$header = @get_headers($url);

if($header !== false && !preg_match('#^HTTP/.*\s+[404]+\s#i', $header[0])) {
    print "URL有るよ";
}else{
    print "URL無いよ";
}

ここまでが前振りです。

個人的にはget_headers()を使ったやり方が一番用途に沿った使い方な気がするので、
get_headers()についてもう少し掘り下げてみました。

まずは「get_headers()」の実行結果を確認するために、こんなコードを実行φ(--)

<?php
//対象URL
$url = "http://i-3-i.info";

$header = @get_headers($url);

var_dump($header);

結果はこんなんでしたφ(--)

array(11) {
  [0]=>
  string(15) "HTTP/1.1 200 OK"
  [1]=>
  string(13) "Server: nginx"
  [2]=>
  string(35) "Date: Wed, 30 Jul 2014 05:19:07 GMT"
  [3]=>
  string(23) "Content-Type: text/html"
  [4]=>
  string(17) "Connection: close"
  [5]=>
  string(38) "Expires: Thu, 10 Nov 1981 08:52:00 GMT"
  [6]=>
  string(77) "Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0"
  [7]=>
  string(16) "Pragma: no-cache"
  [8]=>
  string(56) "Set-Cookie: PHPSESSID=p8a87g3pkjqphga7obiu8q7m2d; path=/"
  [9]=>
  string(22) "X-Powered-By: PleskLin"
  [10]=>
  string(18) "MS-Author-Via: DAV"
}

セッションIDとかの数値系は適当に変更しています。
見て分かる通り、戻り値となる配列の最初の要素にステータスコードが格納されていますね。

サーバ側にはどんな履歴が残るんだべ(--?と気になったので
サーバ側のアクセスログも確認してみました。

残っていたログはこんなんでしたφ(--)

212.205.XX.YY - - [30/Jul/2014:14:19:07 +0900] "GET / HTTP/1.0" 200 91117 "-" "-"

あら、シンプルですね。
考えてみれば当たり前ですが、ヘッダ情報しか取得していないので、
該当URLのHTMLファイル内で読み込んでいる外部ファイル(JavaScriptやCSSなど)は参照していません。

無許可で他人様のホームページに対して実行する場合、
ちょろっと試す分には問題なさそうですが、連続して行うとバレそうですね。

ちなみにURL以外を指定した場合やサーバからのレスポンスを取得できない場合は「false」が戻ってきます。
例えばこんなコードを実行するとφ(--)

<?php
//対象URL
$url = "hogehoge";

$header = @get_headers($url);

var_dump($header);

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

bool(false)

「get_headers()」の戻りを参照する場合はご注意くださいね。
例えばこんな比較であれば問題ありませんがφ(--)

$header = @get_headers($url);
if(preg_match('#^HTTP/.*\s+[200|302]+\s#i', $header[0])) {
    print "URL有るよ";
}else{
    print "URL無いよ";
}

こんな比較をすると問題がありますφ(--)

$header = @get_headers($url);
if(!preg_match('#^HTTP/.*\s+[404]+\s#i', $header[0])) {
    print "URL有るよ";
}else{
    print "URL無いよ";
}

$headerが「false」なので「URL有るよ」なルートに入っちゃうのです。
「一致しない」を条件に比較するときは、例えば

$header = @get_headers($url);
if($header !== false && !preg_match('#^HTTP/.*\s+[404]+\s#i', $header[0])) {
    print "URL有るよ";
}else{
    print "URL無いよ";
}

のように、falseかどうかの判断も入れてあげてください。

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

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

  関連記事