Web Artisan Blog - ウェブ アルチザン ブログ

PHPでデッドリンク(リンク切れ)をチェックする

PHP (55 items)

2005年12月28日

ネットで検索してみてもわかりますが、
PHPでデッドリンクチェックする以下の方法がいいと思います。

まず、PHPはfopen関数でURLをオープンする事ができます。
で、この関数を使って、

if (!fopen('http://www.res-system.com')) {
  //リンク切れ
}


とすればいいやんと考えがちですが、
これだとタイムアウトの制御も出来ないし、
URLで指定されたアドレスをファイルとしてopenしに行きますので、
処理時間がかかるし、厳密にチェックできてると言えません。

ではどうすれば?という事ですが、
以下のサイトが非常に参考になります。

PHPでHTTPリクエストをしてみる
404をチェックするにはHTTPリクエストが出来なくてはいけないと言うことで、まずはHTTPのHEADレスポンスを取得するスクリプトを書いてみます。


参考になる、というか、
もうまんまここに書いてある関数を使えますね。
fsockopen関数を使い、ソケット通信でURLをチェックするわけです。
ちなみに、ソケットとは以下の通りですね。

ソケットとは【socket】─意味・解説:IT用語辞典e-Words
TCP/IPで通信を行なうコンピュータが持つネットワーク内での住所にあたるIPアドレスと、IPアドレスのサブ(補助)アドレスであるポート番号を組み合わせたネットワークアドレスのこと。
1つのビル(IPアドレス)に複数の階(ポート)があり、どのビルのどの階かを指定して通信を行なうのがソケットであると言える。



つまり、get_http_header関数の連想配列戻り値「$status」の、
「$status['Status-Code']」の値を見て判断すれば良いのです。
この値の内容が何を意味するのかは、
以下のサイトなんかでも記述されています。

[Studying HTTP] HTTP Status Code
1xx: Informational - リクエストは受け入れられ、処理を続けている 
2xx: Success - 動作は正常に受信され、理解され、受け入れられた 
3xx: Redirection - リクエストを完了するためには、さらに動作を行わなければならない 
4xx: Client Error - リクエストは間違った構文か、果たす事のできないものを含んでいる 
5xx: Server Error - サーバは明白に明らかにリクエストを果たすのに失敗した



上記から、「$status['Status-Code']」の頭1桁を見て、
チェック先のURLの状態を判断できます。
例えば以下なロジックで判断できる訳です。

$head = get_http_header($uri);
$response = $head['Status-Code'];
if (substr($response, 0, 1) == '1') {
} elseif (substr($response, 0, 1) == '2') {
} else {
  //リンク切れ
}




完璧なデッドリンクチェックにはもう少し工夫が要るかもしれませんが、
これである程度理想的なチェックが行えます。

・・と、ほとんど他サイト流用ネタでした。。

前の記事 次の記事

Comments

arere wrote:

if (
substr($response, 0, 1) != '1' &&
substr($response, 0, 1) != '2' &&
substr($response, 0, 1) != '3'
) {
//リンク切れ
}
2006年05月24日 23時59分07秒

Add Comments

Trackback

N・Hのメモ書き wrote:

リンク切れチェックで404エラーを探す:
参考記事>> PHPでデッドリンク(リンク切れ)をチェックする 今日からマイクリエイト.jpのほうでリンク切れチェックを導入しました。 サイトの定期更新時にデータベースから各ゲームのリンク先のURLを下記ほうほうでチェックして、それから出てきた全てのHTTP_STATUSをデ..
2007年01月20日 15時03分28秒

Trackback URL

http://www.res-system.com/weblog/action.php?action=plugin&name=TrackBack&tb_id=545