PHPで外部のURLが存在しているのか調べたいときってありますよね。
その場合は file_exists などの関数は内部専用なので使えません。
そこでここでは外部のURLの存在チェックすることができる方法について紹介します。
存在チェックにはレスポンスコードを使うのが簡単
PHPで外部URLの存在チェックができる関数があればいいんですが、残念ながらありません。
ライブラリでそういう関数があるかもしれませんが、ここでは純粋なPHPでチェックがしたいです。
そこで手軽にURLチェックに使えるのがステータスコード
「ステータスコードって何?」という人に説明しておくと
のことをステータスコードを読んでます。
よく聞く「404 not found」とかもステータスコードの一種です。
それでこのコードは100区切りで100番代から500番代まで次のように分類できます。
- 100番代(1xx)
リクエストが受け取られたときに返ってくるコード
- 200番代(2xx)
リクエストが受け取られ正しく処理されたときに返ってくるコード
ブラウザで正しくページが表示される場合は大体 200 が返ってくる - 300番代(3xx)
リダイレクトとかの追加の処理が必要な時に返ってくるコード
- 400番代(4xx)
ブラウザなどのクライアントから変なリクエストがあった時に返されるコード
有名なのは存在しないページにアクセスしたときの「404 Not Found」 - 500番代(5xx)
サーバーがリクエストの処理に失敗したときに返ってくるコード
例えばサーバーダウンしてページが見れなかったりなどした場合
この5種類に分けられています。
この内でページが存在する場合に返ってくるのは200~300番代のコード
なのでページの存在チェックにはステータスコードが200~300の範囲内化調べればOK
では具体的なコード例について次で紹介します。
URLの存在チェックをするPHPコード
そのPHPコードというのがこちら
1 2 3 4 5 6 7 8 |
$url = 'http://google.co.jp'; $headers = @get_headers( $url ); if( preg_match( '/[2][0-9][0-9]|[3][0-9][0-9]/', $headers[0] ) ){ print_r('URLは存在します'); }else{ print_r('URLは存在しません!'); } |
まずget_headers関数でヘッダー情報を連想配列として全て取得
そしてその連想配列の1番目( headers[0] )にステータスコードが含まれています。
なのでその中に 200 ~ 300 までの数字が含まれているか正規表現を使って preg_match で調べることでURLの存在チェックを行うことが可能です。
実際は次のように関数化すれば便利
1 2 3 4 5 6 7 8 9 10 |
function url_exists( $url ){ if( ! $url && ! is_string( $url ) ){ return false; } $headers = @get_headers( $url ); if( preg_match( '/[2][0-9][0-9]|[3][0-9][0-9]/', $headers[0] ) ){ return true; }else{ return false; } } |
URLがそんざいしていれば treu 、存在していないあるいは不正な場合は false が返ってきます。
ということでURLの存在チェックをする方法についてでした。
PHPには外部URLについては file_exits が使えないので注意です。
ではでは($・・)/~~~