SOFTELメモ

</> 技術者募集

【php】 URLが存在するかどうか確認する

問題

あるURLが存在するかどうかphpで確認したい。

php-logo

答え

phpでhttpのリクエストを送信してURLにアクセス可能かどうか確認する方法はいくつかある。

1、file_get_contents

リクエスト先がないときwarningが発生するので@で抑えている。

$url = 'http://www.example.com/';
$response = @file_get_contents($url);
if ($response !== false) {
    echo '存在した';
} else {
    echo '存在しない';
}

2、fopen

$url = 'http://www.example.com/';
$fp = @fopen($url, 'r');
if ($fp) {
    fclose($fp);
    echo '存在した';
} else {
    echo '存在しない';
}

3、get_headers

$url = 'http://www.example.com/';
$header = @get_headers($url);
if (preg_match('/^HTTP¥/.*¥s+200¥s/i', $header[0])) {
    echo '存在する';
} else {
    echo '存在しない';
}

4、get_headers(HEADリクエスト版)

リクエスト先のサーバーがHEADリクエストを受け付けてくれるのがわかっている場合は、ヘッダだけ返ってくるのでお互い処理が早い。リクエスト先のサーバーがHEADリクエストを受け付けてくれないかもしれないときは使えない。

//あらかじめ設定しておいて
stream_context_set_default(
    array(
        'http' => array(
            'method' => 'HEAD'
        )
    )
);

//リクエストしてみる
$url = 'http://www.example.com/';
$header = @get_headers($url);
if (preg_match('/^HTTP¥/.*¥s+200¥s/i', $header[0])) {
    echo '存在する';
} else {
    echo '存在しない';
}

4、file_get_contents(高速化)

file_get_contents関数は対象の何バイト目から何バイト目を取得するか指定することができるので、httpのレスポンスの最初の1文字だけ取得するようにすることができる。

$url = 'http://www.example.com/';
$response = @file_get_contents($url, NULL, NULL, 0, 1);
if ($response !== false) {
    echo '存在する';
} else {
    echo '存在しない';
}

比較すると

方法はいろいろ考えられるが、どの方法が特別速いということもない。

存在を確認するだけならば、リクエスト先のコンテンツを無駄に全部取得しないのがおすすめ。

file_get_contents()で全部取得する方法(1の方法)が、レスポンスの容量が大きい画像やPDFなどの場合、遅い。

関連するメモ

コメント