PHPを使用してFTPプロトコルを介してリモートサーバーを操作する場合、 FTP_RAWLIST()は、UNIXシステムのLS -Lコマンドと同様に出力を返すことができる一般的な関数です。これらの生の出力は完全なファイルリスト情報を提供しますが、その形式はプレーンテキスト文字列であるため、ファイルサイズや変更時間などの特定の情報を抽出するには追加の処理が必要です。
この記事では、 ftp_rawlist()の出力を解析することにより、各ファイルのサイズと最後の変更時間を抽出する方法を紹介し、サンプルコードが付属しています。
ftp_rawlist()文字列の配列を返します。各要素は、次のように形式のファイルまたはディレクトリに関する情報を表します。
-rw-r--r-- 1 user group 1048576 May 21 13:37 filename.zip
drwxr-xr-x 2 user group 512 May 20 10:15 subdir
各行は、ファイルタイプ、アクセス許可、リンク数、所有者、グループ、サイズ、変更の日付と時刻、ファイル名を含むスペース分離文字列です。
ファイルのサイズと変更時間を抽出するには、これらのフィールドを正規表現で解析できます。
<?php
// 接続する FTP
$ftp = ftp_connect("gitbox.net");
ftp_login($ftp, "username", "password");
// ディレクトリリストを取得します
$rawList = ftp_rawlist($ftp, ".");
// 各ラインを反復して解析します
foreach ($rawList as $line) {
if (preg_match('/^([\-ld])([rwx\-]{9})\s+\d+\s+\S+\s+\S+\s+(\d+)\s+([A-Za-z]{3})\s+(\d{1,2})\s+(\d{2}:\d{2}|\d{4})\s+(.*)$/', $line, $matches)) {
$type = $matches[1];
$size = $matches[3];
$month = $matches[4];
$day = $matches[5];
$timeOrYear = $matches[6];
$name = $matches[7];
// 変更された時間をタイムスタンプに変換します
$currentYear = date("Y");
$fileTimeStr = "$month $day $timeOrYear";
if (strpos($timeOrYear, ':') !== false) {
// それは時刻を意味します,年は今年です
$fileTimeStr .= " $currentYear";
$timestamp = strtotime($fileTimeStr);
} else {
// 時間は年です
$timestamp = strtotime("$month $day $timeOrYear");
}
echo "書類: $name\n";
echo "タイプ: " . ($type === 'd' ? '目次' : '書類') . "\n";
echo "サイズ: $size バイト\n";
echo "変更時間: " . date("Y-m-d H:i:s", $timestamp) . "\n";
echo "-----------------------------\n";
}
}
ftp_close($ftp);
?>
FTP_RAWLIST()の形式は、リモートサーバーのオペレーティングシステムタイプに依存し、上記のルールはUNIXスタイルのリストの結果を対象としています。サーバーがWindows FTPを使用する場合、出力形式は完全に異なり、実際の状況に応じて調整する必要があります。
一貫性のない形式によって引き起こされる問題を防ぐために、解析プロセス中に常に定期的なマッチングエラー処理を実行することをお勧めします。
タイムゾーンを越えたサーバーの場合、 strtotime()変換の結果にエラーがある場合があります。 DateTimeクラスおよびタイムゾーンオブジェクトを使用して、時間をより正確に処理することをお勧めします。
上記の方法を使用して、 FTP_RAWLIST()の結果からファイルサイズと変更時間を簡単に抽出し、ファイルの同期、ログ分析、その他のシナリオに使用できます。