PHPでURLが存在するか確認する方法

PHPでURLが存在するか確認する方法

色々調べたのですがはまったので自分の為のまとめ

1.get_headers

参考:URLが実際に存在するかどうかを調べる方法(PHP) | PIXTURE STUDIO

~~~
2.fopen

参考:PHPでリンク先が存在するかどうかを調べる方法 – あざわの備忘録
~~~

~~~

3.file_get_contents

~~~
4.pear

わざわざ使いたくないのでパス

これらを実際にまとめてやってみる
~~~

get_headers

‘;
$header = get_headers($url);
if(strstr($header[0], ‘200’)) {
echo $url . ‘は存在します’;
} else {
echo $url . ‘は存在しません’;
}

echo ‘

fopen

‘;
if($fp = fopen($url, “r”)){
echo $url . ‘は存在します’;
}else{
echo $url . ‘は存在しません’;
}

echo ‘

file_get_contents

‘;
$data = file_get_contents($url);
if($data){
echo $url . ‘は存在します’;
}
else{
echo $url . ‘は存在しません’;
}
}
~~~

結果はどうなるかと言いますと

get_headers

~~~

Warning: get_headers(http://www.hoge.co.jp/) [function.get-headers]: failed to open stream: php_network_getaddresses: getaddrinfo failed: Name or service not known in /var/www/html/test/test.php on line 9
http://www.hoge.co.jp/は存在しません
~~~

fopen

~~~

Warning: fopen(http://www.hoge.co.jp/) [function.fopen]: failed to open stream: php_network_getaddresses: getaddrinfo failed: Name or service not known in /var/www/html/test/test.php on line 17
http://www.hoge.co.jp/は存在しません~~~

file_get_contents

~~~

Warning: file_get_contents(http://www.hoge.co.jp/) [function.file-get-contents]: failed to open stream: php_network_getaddresses: getaddrinfo failed: Name or service not known in /var/www/html/test/test.php on line 24
http://www.hoge.co.jp/は存在しません
~~~

こんな感じになりました。
存在しないURLをはじきたいのにWarningが出ちゃうのはちょっとどうなんでしょう
(このまま使うには@つければWarningは出なくなります)

じゃあどうすればいいのか、という話になると正直いい方法が見当たらないわけですが
~~~
curl

‘;
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);

$r = curl_exec($ch);
$r = split(“\n”, $r);
if (preg_match(‘/200/’, $r[0])) {
echo $url . ‘は存在します’;
} else{
echo $url . ‘は存在しません’;
}
~~~

こんな感じで結果は得られます
if文をもう少し厳密にすればもっと正しい処理になるような、でもやっぱ微妙なような。

もっといい方法あったら教えてくださいまし\(^-^)/