當前位置: 首頁> 最新文章列表> 定時任務中使用ftp_rawlist 獲取每日更新文件

定時任務中使用ftp_rawlist 獲取每日更新文件

gitbox 2025-05-26

場景簡介

假設我們有一個每天都會更新文件的遠程FTP 服務器,我們的目標是每天凌晨通過PHP 腳本自動連接該服務器,檢查哪些文件是當天新上傳的,然後將這些文件下載到本地進行後續處理。

步驟一:連接FTP 服務器

首先,我們需要連接到FTP 服務器,並登錄:

 $ftp_host = 'ftp.gitbox.net';
$ftp_user = 'username';
$ftp_pass = 'password';

$conn_id = ftp_connect($ftp_host);
if (!$conn_id) {
    die("無法連接到 FTP 伺服器");
}

$login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);
if (!$login_result) {
    ftp_close($conn_id);
    die("FTP 登錄失敗");
}

步驟二:獲取目錄列表

使用ftp_rawlist來獲取目標目錄中的文件信息:

 $remote_dir = '/updates/';
$raw_list = ftp_rawlist($conn_id, $remote_dir);
if ($raw_list === false) {
    ftp_close($conn_id);
    die("無法獲取文件列表");
}

步驟三:解析文件列表

ftp_rawlist返回的是一組類似Unix ls -l命令輸出的行,我們需要解析這些行,提取出文件名和修改時間:

 $today = date('M d'); // e.g., "May 23"
$files_to_download = [];

foreach ($raw_list as $line) {
    $parts = preg_split("/\s+/", $line, 9);
    if (count($parts) < 9) continue;

    $month = $parts[5];
    $day = str_pad($parts[6], 2, '0', STR_PAD_LEFT);
    $file_time_or_year = $parts[7];
    $name = $parts[8];

    if ("$month $day" == $today) {
        $files_to_download[] = $name;
    }
}

步驟四:下載文件

接著下載當日更新的文件:

 foreach ($files_to_download as $file) {
    $local_file = __DIR__ . "/downloads/$file";
    $remote_file = $remote_dir . $file;
    if (ftp_get($conn_id, $local_file, $remote_file, FTP_BINARY)) {
        echo "成功下載文件:$file\n";
    } else {
        echo "下載失敗:$file\n";
    }
}

步驟五:關閉連接

任務完成後,關閉FTP 連接:

 ftp_close($conn_id);

總結

通過上述步驟,我們實現了一個基於PHP 的定時任務腳本,能夠自動連接FTP 服務器並下載每日更新的文件。該腳本可以配合Linux 的cron定時任務系統,每天定時運行,無需人工干預。此方法適用於需要定期同步更新文件的各種場景,尤其是在處理日誌文件、數據同步或靜態資源更新時非常實用。