PHPで複数のFTPの接続を一括チェック

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

PHPで複数のFTPの接続を一括チェック。FTP一つとかだったら直接FTPクライアントで試すのが手っ取り早い。

目次

仕様?

  • ブラウザからアクセスし、テキストエリアにFTP情報をTSV形式でコピペ。
  • 1件ずつ、調査。
  • 調査の時間短縮のため非同期処理。
  • FTPの接続確認はPHP(API)で行う。
  • 基本、公開サービスじゃないのでエラー処理等は無し。
  • フロント側の制御はHTML・knockout.jsで行う。

FTPの接続確認のAPI

仮に「chkConnectFtp.php」という名称で保存する。

<?php
	$userName = $_GET["userName"];
	$ftp_server = $_GET["host"];
	$ftp_user = $_GET["id"];
	$ftp_pass = $_GET["pw"];
	
	$message = "retry";
	$conn_id = ftp_connect($ftp_server);
	
	if ($conn_id == false){
		// 接続失敗
		$message = "failed Connected";
	}
	else {
		// ログインを試みる
		if (@ftp_login($conn_id, $ftp_user, $ftp_pass)) {
			//echo "Connected as $ftp_user@$ftp_server\n";
			$message = "success";
		}
		else {
			//echo "Couldn't connect as $ftp_user\n";
			$message = "failed Login";
		}
		
		// 接続を閉じる
		ftp_close($conn_id);
	}
	
	$result = array();
	$result["userName"] = $userName;
	$result["host"] = $ftp_server;
	$result["id"] = $ftp_user;
	$result["pw"] = $ftp_pass;
	$result["message"] = $message;
	
	echo json_encode($result);
?>

フロント側

Ftpcheck.jpg

上図のA2~D3までをテキストエリアにコピペ(※上図はExcelのキャプチャ)

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<script type="text/javascript" src="jquery-1.5.1.min.js"></script>
<script type="text/javascript" src="knockout-2.1.0beta.js"></script>
<title>FTP接続チェック</title>

<style type="text/css">

* {
	font-family: "メイリオ";
	font-size:10pt;
}

table {
	border-collapse: collapse;
	margin: 5px 0 0;
}
caption {
	padding: 3px 0;
	text-align: left;
}
th, td {
	border: 1px solid #CCCCCC;
	font-weight: normal;
	padding: 3px;
	text-align: left;
	vertical-align: top;
}
th {
	background: none repeat scroll 0 0 #F0F0F0;
}
textarea {
	width: 400px;
	height: 200px;
}

h2, h3 {
	margin: 0;
	padding: 0 0 5px;
	font-size:12pt;
}

ul, li{
	margin:0;
	padding:0;
}
li {
	margin-left:2em;
}

</style>

<script type="text/javascript">
	var ViewModel = function () {
		var self = this;
		
		self.results = ko.observableArray();
		
		self.lists = ko.observable("");
		self.nowChk = ko.observable(0);	// 調査済みの総数
		self.allChk = ko.observable(0);	// 調査対象の総数
		self.excel = ko.observable(null);	// Excel用にTSVにする。
		
		self.excelData = ko.observable();
		
		self.countStart = function() {
			self.results.removeAll();
			self.nowChk(0);
			self.allChk(0);
			
			var tmpRows = self.rmEmptyAry(self.lists().split("\n"));
			for (var i in tmpRows) {
				self.allChk(tmpRows.length);
				var tmpRow = tmpRows[i].split("\t");
				
				var tmpData = {};
				tmpData.userName = tmpRow[0];
				tmpData.host = tmpRow[1];
				tmpData.id = tmpRow[2];
				tmpData.pw = tmpRow[3];
				
				// APIのパスを指定。APIとこのHTMLファイルを別ドメインにすると動かないかもしれない。
				$.getJSON("chkConnectFtp.php", tmpData, function(json){
					self.results.push(json);
					var tmpNum = self.results().length;
					self.nowChk(tmpNum);
					
					// 全部チェックが終わったとき
					if (tmpNum == self.allChk()) {
						alert("complete");
						var tmpExcel = "";
						for (var j in self.results()){
							tmpExcel += self.results()[j].userName + "\t";
							tmpExcel += self.results()[j].host + "\t";
							tmpExcel += self.results()[j].id + "\t";
							tmpExcel += self.results()[j].pw + "\t";
							tmpExcel += self.results()[j].message + "\t";
							tmpExcel += "\n";
						}
						self.excel(tmpExcel);
					}
				});
			}
		}
		
		self.rmEmptyAry = function(ary) {
			var tmpAry = new Array();
			for (var i in ary) {
				if(ary[i] != ""){
					tmpAry.push(ary[i]);
				}
			}
			return tmpAry;
		}
		
	}
    
	$(document).ready(function () {
		ko.applyBindings(new ViewModel());
	});
</script>
</head>

<body>
<div>
	<h2>調査対象</h2>
	「表示用・FTP HOST・FTP ID・FTP Pwd」の順でタブ区切り。<br />
	例)「丸ごとシマウマ ftp.simauma.com idShimaUma pwShimaUma」<br />
	<textarea style="margin-top:5px" data-bind="value: lists"></textarea><br />
	<button data-bind="click: $root.countStart">調査</button><br />

	<hr />
	<h2>結果</h2>
	<div data-bind="text: nowChk() + ' / ' + allChk()"></div>
	<div data-bind="with: excel">
		<h3>▼excelに張り付けてvlookupとかで合体</h3>
		<textarea data-bind="value: $data"></textarea>
	</div>
	
	<table>
		<thead>
			<tr>
				<th>名称</th>
				<th>ホスト</th>
				<th>ID</th>
				<th>PW</th>
				<th>結果</th>
			</tr>
		</thead>
		<tbody data-bind="foreach: results">
			<tr>
				<td data-bind="text: userName"></td>
				<td data-bind="text: host"></td>
				<td data-bind="text: id"></td>
				<td data-bind="text: pw"></td>
				<td data-bind="text: message"></td>
			</tr>
		</tbody>
	</table>
	<ul>
		<li>success - FTPサーバに接続成功→ログイン成功</li>
		<li>failed Login - FTPサーバに接続成功→ログイン失敗</li>
		<li>failed Connected - FTPサーバに接続失敗</li>
	</ul>
</div>
  • getJSON()でAPIを呼び出す。
  • 別途「jquery-1.5.1.min.js」「knockout-2.1.0beta.js」を用意する必要あり。

関連項目