URLリストからリンク切れをチェックする

URLのリストをもらって、それを配列に格納してひとつずつリンクが有効かどうかを判定するプログラムを作成。
1度だけ使うものだったので、ちょっと適当です。コマンドラインとかでぱっと実行するときに使う用ですね。

1.準備

・URLリスト
テキストファイルで、URLがずらっと一行ずつ並んでいるリスト

url.txt
https://aaa.ccc.jp
https://aaa.bbb.jp
https://bbb.ccc.jp

 

 

2.コードを書く

処理の流れとしては、
1,phpファイルと同じ階層(フォルダ)にあるテキストファイルを読み込む
2,ファイルから読み込んだURL一覧を行に分割して、無駄なスペースなどを省く
3,分割したURLを一つずつ配列に格納していく
4,foreachで配列を回して、配列に入っているURLにひとつずつアクセスする
5,帰ってきたステータスを見て、404が返ってこなければリンク切れでないと判定
6,有効なURL一覧を表示する

5については、判定したいものによって条件分岐を変えてください。今回は404エラーでなければOKとしました。

 

 

実際のコード

//テキストファイルを読み込む
$text = file_get_contents("url.txt");

//配列に格納するために改行(\n)ごとに行に分割して余分なスペースを取り除く
$array = explode("\n", $text); 
$array = array_map('trim', $array);


//有効なURLを格納する変数と、無効なURLを格納する変数を準備
$exist_list = [];
$not_exist_list = [];

//配列のなかのURLをひとつずつ見て有効かどうか判定する
foreach($array as $value){

//ヘッダーを取得する
$header = @get_headers($value);

//ヘッダーの0番目の要素を判定
if($header[0] !== 'HTTP/1.0 404 Not Found'){
 $exist_list[] = $value;
 }else{
 $does_not_exist[] = $value;
 }
}


var_dump($exist_list);

exit;



explode

文字列を文字列で区切った配列を返します。
http://php.net/manual/ja/function.explode.php
$array = explode(‘区切りに使いたい文字’,文字列);
で、区切り文字(デリミタ)で区切られた文字列が配列になって返ってきます。

array_map

指定した配列の各要素にコールバック関数を適用します。配列の一つ一つの要素にforeachでアクセスして関数を適用するのと動きは同じです(内部的には全然違ったりするかも…誰か教えてください)。
http://php.net/manual/ja/function.array-map.php
$array = array_map(‘適用したい関数名’,対象となる配列);

 

 

get_headers

GETリクエストを送ってサーバーから返ってきたヘッダーを全部取得します。
今回はURLにアクセスして返ってきたヘッダーを取得。PHP5から使えます。
http://php.net/manual/ja/function.get-headers.php

これ使うと、返り値は失敗すればfalse、成功すれば
Array
(
[0]=>
string(30) “HTTP/1.0 301 Moved Permanently”
[1]=>
string(35) “Location: https://www.google.co.jp/”
[2]=>
string(38) “Content-Type: text/html; charset=UTF-8”
[3]=>
string(35) “Date: Thu, 10 Aug 2017 22:39:20 GMT”
[4]=>
string(38) “Expires: Sat, 09 Sep 2017 22:39:20 GMT”
[5]=>
string(38) “Cache-Control: public, max-age=2592000”
)
こんな配列が返ってきます。
今回はアクセスできたかどうかが知りたいので0番目の要素が「HTTP/1.0 404 Not Found」だったら無効なURLであると判断しています。

6について、今回はちょこっと使うだけだったのでコマンドライン上でvar_dumpで表示したものをコピペしてリスト化しましたが、ちゃんとやるならfile_put_contents関数でファイルとかに吐き出したほうがいいのかも。
あとリストが長いと本当に実行されてるか不安になってしまうので、要所にechoでなんか入れてやると安心できますね。

 

あんまり使わないけど一度作っておくと使いまわせるツールになるのでお勧めです。

 

まみたす
まみたすです
The following two tabs change content below.
まみたす

まみたす

1992年生まれ。知識ゼロ文系女子からSEになっているところ。 カメラ、猫、お酒、旅行がすきです。
この記事の内容が役に立ったと思ったら、SNSで記事を共有してもらえると幸いです。

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)