PHPでサイトにアクセスしたときのステータスコード一覧取得

提供:wiki - PCスキルの小技・忘却防止メモ
移動: 案内, 検索

PHPでサイトにアクセスしたときのステータスコード一覧取得

ソース

ブラウザからアクセスして、テキストエリアにURL一覧をコピペすればOK。

<?php

//初回起動時
$myself = basename($_SERVER["PHP_SELF"]);
$rst = "";

$out = "";
$exc = "";
$urlori = "";

// 送信ボタンが押されたとき
if ( isset($_POST["Submit"]) != FALSE && 
     isset($_POST["URL"]) != FALSE && $_POST["URL"] != "" ) {
	
	$urlori = $_POST["URL"];
	$urlAry = explode("\n", $urlori);
	$rst = "";
	
	// 5個ずつグループ化(10個ずつでもオーバーフロー(?)することあり)
	$tmpUrl = array(array());
	$i = 0;
	foreach( $urlAry as $rowUrl ) {
	    if (5 < count($tmpUrl[$i]) && $rowUrl != ""){
	        $i++;
	        $tmpUrl[$i] = array();
	    }
	
	    if($rowUrl != ""){
	        $tmpUrl[$i][] = $rowUrl;
	    }
	}
	
	echo '<div class="resultBox">';
	echo '<table>';
	echo '<tr><th>No</th><th>url</th><th>ステータスコード</th></tr>';
	
	$num = 1;
	foreach( $tmpUrl as $urlAry ) {
	    $results = getStatusCodeCurl($urlAry);
	
	    foreach($results as $result){
	        echo '<tr>';
	        echo '<td>' . $num++ . '</td>';
	        echo '<td>' . $result["url"] . '</td>';
	        echo '<td>' . $result["message"] . '</td>';
	        echo '</tr>';
	    }
	    unset($results);
	}

	echo '</table>' . "\n";
	echo '</div>' . "\n";
}
elseif( isset($_POST["RESET"]) != FALSE ){
	$urlori = "";
	$out = "";
}
else{
	// 値が入っていたらそのまま元に戻す。
	if ( isset($_POST["URL"]) != FALSE && $_POST["URL"] != "" ) {
	    $urlori = stripslashes($_POST["URL"]);
	}
}

function getStatusCodeCurl($urlAry) {
	// マルチハンドルの用意
	$mh = curl_multi_init();

	// URLをキーとして、複数のCurlハンドルを入れて保持する配列
	$ch_list = array();
	
	// Curlハンドルの用意と、マルチハンドルへの登録
	for($j=0; $j<count($urlAry); $j++ ) {
	    $ch_list[$j] = curl_init($urlAry[$j]);
	    curl_setopt($ch_list[$j], CURLOPT_RETURNTRANSFER, TRUE);
	    curl_setopt($ch_list[$j], CURLOPT_TIMEOUT, 1); // タイムアウト秒数を指定
	    curl_multi_add_handle($mh, $ch_list[$j]);
	}
	
	// 一括で通信実行、全て終わるのを待つ
	$running = null;
	do {
	    curl_multi_exec($mh, $running); 
	}
	while ( $running );
	
	// 実行結果の取得
	$results = array();
	$returnAry = array();
	for ($i=0; $i<count($urlAry); $i++){
	    // ステータスの取得
	    $results[$i] = curl_getinfo($ch_list[$i]);
	
	    $tmp = array();
	    $tmp['url'] = $urlAry[$i];
	
	    if( $results[$i]["http_code"] == "" ) {
	        $tmp['message'] = '取得できませんでした・タイムアウトかもしれない';
	    }
	    else {
	        $tmp['message'] = $results[$i]["http_code"];
	    }
	    $returnAry[] = $tmp;
	
	    // Curlハンドルの後始末
	    curl_multi_remove_handle($mh, $ch_list[$i]);
	    curl_close($ch_list[$i]);
	}
	
	// マルチハンドルの後始末
	curl_multi_close($mh);
	unset($mh, $ch_list, $results);

	return $returnAry;
}

?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
 "http://www.w3.org/TR/html4/loose.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>ステータスコード一覧取得</title>
<style type="text/css"><!--
body{
	position:relative;
	top:0;
	left:0;
}
em{color:red;}
.resultBox{
	margin-top:10px;
}
.resultBox table{border-collapse:collapse;margin:0;}
.resultBox caption{text-align:left;}
.resultBox th,td{
	text-align:left;
	vertical-align:top;
	padding:3px 5px;
	font-weight:normal;
	border:1px solid #ccc;
}
.resultBox th{
	background:#ccffff;
}
.scForm span{
	font-size:0.9em;
}
--></style>
</head>

<body>
<h1>ステータスコード一覧取得(疑似・非同期版)</h1>
<form method="post" action="<?= $myself ?>" class="scForm">
▼URL一覧<br>
<textarea name="URL" style="width:99%;height:10em;"><?php if($urlori != "")echo $urlori; ?></textarea><br>
<span>※ファイルで終らないときは最後に「/」をつける。ブラウザではブラウザが補完してくれるけど、このスクリプトでは補完しない。</span><br>
<br>
<input type="submit" name="Submit" value="送信">
<input type="submit" name="RESET" value="クリア"><br>
</form>
<?php echo $out; ?>
<?php echo $exc; ?>
</body>
</html>

※調査対象のURL一覧の数少なければ5件ずつグループにするとか不要。

  • タイムアウト秒数を「1秒」に指定しているのでサーバーの返事が遅いと接続できないと返ってくる。

関連項目