在PHP開發中,尤其是涉及到自動化文件管理或遠程服務器交互的任務時, ftp_rawlist()是一個非常有用的函數。它允許開發者通過FTP協議獲取目錄的原始列表信息,這對於精細處理FTP服務器上的文件非常關鍵。本文將深入探討ftp_rawlist()函數的使用技巧,並結合實戰案例,展示其在命令行腳本中的應用。
ftp_rawlist()是PHP FTP 擴展提供的函數之一,原型如下:
array ftp_rawlist ( FTP\Connection $ftp_stream , string $directory [, bool $recursive = false ] )
該函數返回指定目錄下的所有文件和子目錄的詳細信息,格式通常與ls -l命令相同。這意味著你可以從返回的字符串中提取權限、文件大小、修改時間、文件名等信息。
在CLI(命令行接口)腳本中, ftp_rawlist()的作用尤為明顯,主要原因包括:
無需GUI交互,自動化處理遠程目錄結構
適合週期性任務,如通過Cron定時檢查FTP目錄
支持自定義邏輯解析目錄結構
<?php
$ftp = ftp_connect('ftp.gitbox.net');
ftp_login($ftp, 'username', 'password');
$rawList = ftp_rawlist($ftp, '/public_html/files');
$recentFiles = [];
$now = time();
foreach ($rawList as $line) {
$parts = preg_split("/\s+/", $line, 9);
if (count($parts) < 9 || $parts[0][0] === 'd') {
continue; // 忽略目錄
}
$month = $parts[5];
$day = $parts[6];
$timeOrYear = $parts[7];
$filename = $parts[8];
$filetime = strtotime("$month $day $timeOrYear");
if ($filetime !== false && ($now - $filetime) <= 7 * 24 * 60 * 60) {
$recentFiles[] = $filename;
}
}
print_r($recentFiles);
ftp_close($ftp);
這個腳本會連接到ftp.gitbox.net上的FTP服務器,獲取/public_html/files目錄下的所有文件,並篩選出最近7天內修改過的文件名。
遞歸支持並不是ftp_rawlist()的內建特性,但我們可以通過遞歸函數自己實現:
<?php
function listAllFiles($ftp, $dir = '.', $base = '') {
$files = [];
$list = ftp_rawlist($ftp, $dir);
foreach ($list as $item) {
$info = preg_split("/\s+/", $item, 9);
$name = $info[8];
$fullPath = "$dir/$name";
if ($info[0][0] === 'd') {
$files = array_merge($files, listAllFiles($ftp, $fullPath, "$base$name/"));
} else {
$files[] = "$base$name";
}
}
return $files;
}
$ftp = ftp_connect('ftp.gitbox.net');
ftp_login($ftp, 'username', 'password');
$allFiles = listAllFiles($ftp, '/public_html/downloads/');
foreach ($allFiles as $file) {
$local = __DIR__ . '/downloads/' . $file;
if (!is_dir(dirname($local))) {
mkdir(dirname($local), 0777, true);
}
ftp_get($ftp, $local, '/public_html/downloads/' . $file, FTP_BINARY);
echo "Downloaded: $file\n";
}
ftp_close($ftp);
該腳本能夠遞歸獲取所有文件路徑,並將其從ftp.gitbox.net的/public_html/downloads/目錄下載到本地目錄中,保持原有的目錄結構。
解析格式不固定:不同FTP服務器返回的列表格式可能略有差異,解析時應使用靈活的正則或拆分邏輯。
連接與超時:建議設置合理的超時與重試邏輯,防止腳本卡死。
權限檢查:確保FTP賬戶有讀取目錄和文件的權限。
ftp_rawlist()函數雖然輸出的是原始字符串,但通過合適的解析和邏輯組合,完全可以構建出功能強大的命令行工具,用於FTP目錄的監控、備份和自動化管理等任務。無論是在日常運維還是自動化腳本中,它都是值得掌握的一個利器。