複数のURL先が存在するか調べる

複数のURL先が存在するか調べる

PHPで指定したURL先が存在するかどうかを調べる方法を紹介します。

また、複数のURLが存在する場合にはどのように対処する必要があるかについても見ていきます。

URL先が存在するか調べる方法(1つの場合)

get_headers( $url );

get_headers関数を利用して取得します。

get_headers関数はURLが存在していた場合、配列の最初の要素にHTTPヘッダーを返します。

それを利用し、正規表現でパターンチェックを行うことで成功失敗を判断します。

また、使用する場合には「@」エラー制御演算子を利用すると良いです。

URL先が存在するか調べる方法(複数の場合)

先ほど紹介した方法ではURL一つにつき毎回アクセスしなければいけません。(ループ内など)

そこでcurlを使用して平行処理により実現してみます。

$mh = curl_multi_init();
	$ch_list = array();
	foreach($urls as $i => $url) {
		$ch_list[$i] = curl_init($url);
		curl_setopt($ch_list[$i], CURLOPT_HEADER,         TRUE);
		curl_setopt($ch_list[$i], CURLOPT_NOBODY,         TRUE);
		curl_setopt($ch_list[$i], CURLOPT_RETURNTRANSFER, TRUE);
		curl_setopt($ch_list[$i], CURLOPT_TIMEOUT, 2);
		curl_multi_add_handle($mh, $ch_list[$i]);
	}
	$running = null;
	do { curl_multi_exec($mh, $running); } while ( $running );

	foreach($urls as $i => $url) {
		$httpCode = curl_getinfo($ch_list[$i], CURLINFO_HTTP_CODE);
		//任意処理
		curl_multi_remove_handle($mh, $ch_list[$i]);
		curl_close($ch_list[$i]);
	}
	curl_multi_close($mh);

複数のURLをセットして、投げて返事待つといった形になっています。

一度に投げれる数に制限があるのかはわかりませんが、自分の場合60個ぐらいで処理がうまくいきませんでした。。。

その場合はプールを作成して処理していくと良いみたいです。(自分にはここよくわからなかったので、10個単位で投げるように外側にループを作成しました。)

また、処理待ちの時間などについては下記記事を参考にしてください。。

https://qiita.com/Hiraku/items/1c67b51040246efb4254

get_headersは個数に応じて時間がかかりますが、curlでは個数に応じた時間はわずかしか変わりません。