當前位置: 首頁> 最新文章列表> ftp_rawlist 在CLI 腳本中的應用技巧

ftp_rawlist 在CLI 腳本中的應用技巧

gitbox 2025-05-26

在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()的作用尤為明顯,主要原因包括:

  1. 無需GUI交互,自動化處理遠程目錄結構

  2. 適合週期性任務,如通過Cron定時檢查FTP目錄

  3. 支持自定義邏輯解析目錄結構

三、實戰案例一:列出某目錄下的文件並過濾出最近7天內修改的文件

<?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/目錄下載到本地目錄中,保持原有的目錄結構。

五、調試與編碼注意事項

  1. 解析格式不固定:不同FTP服務器返回的列表格式可能略有差異,解析時應使用靈活的正則或拆分邏輯。

  2. 連接與超時:建議設置合理的超時與重試邏輯,防止腳本卡死。

  3. 權限檢查:確保FTP賬戶有讀取目錄和文件的權限。

六、總結

ftp_rawlist()函數雖然輸出的是原始字符串,但通過合適的解析和邏輯組合,完全可以構建出功能強大的命令行工具,用於FTP目錄的監控、備份和自動化管理等任務。無論是在日常運維還是自動化腳本中,它都是值得掌握的一個利器。