当前位置: 首页> 最新文章列表> 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目录的监控、备份和自动化管理等任务。无论是在日常运维还是自动化脚本中,它都是值得掌握的一个利器。