在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目录的监控、备份和自动化管理等任务。无论是在日常运维还是自动化脚本中,它都是值得掌握的一个利器。