当前位置: 首页> 最新文章列表> 定时任务中使用 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 定时任务系统,每天定时运行,无需人工干预。此方法适用于需要定期同步更新文件的各种场景,尤其是在处理日志文件、数据同步或静态资源更新时非常实用。