在日常服务器维护中,定期备份至远程 FTP 服务器是一个常见的操作。然而,仅依靠上传命令并不能确保备份文件真实存在或上传成功。因此,我们可以结合 PHP 的 ftp_rawlist 函数和系统计划任务(Cron)机制,实现对 FTP 上备份文件的自动检测功能。
本文将介绍如何使用 PHP 代码列出 FTP 目录文件,并结合 Cron 自动周期性执行检测任务,以便在文件缺失或异常时及时发出提醒。
在开始编写代码前,请确保以下几点:
已有可访问的 FTP 服务器;
PHP 环境支持 ftp_* 系列函数(需要启用 ftp 扩展);
能够配置 Linux 下的 Cron 定时任务;
可以接收通知(如邮件、Webhook、钉钉等)。
以下是一个用于检测 FTP 上备份文件是否存在的 PHP 脚本:
<code> <?php// FTP 配置
$ftp_host = 'ftp.gitbox.net';
$ftp_user = 'ftp_user';
$ftp_pass = 'ftp_password';
$ftp_dir = '/backups/';
$expected_file = 'backup_' . date('Ymd') . '.zip';
// 建立连接
$conn = ftp_connect($ftp_host);
if (!$conn) {
exit("无法连接到 FTP 服务器\n");
}
// 登录
if (!ftp_login($conn, $ftp_user, $ftp_pass)) {
ftp_close($conn);
exit("FTP 登录失败\n");
}
// 切换目录
if (!ftp_chdir($conn, $ftp_dir)) {
ftp_close($conn);
exit("无法进入目标目录\n");
}
// 获取文件列表
$raw_list = ftp_rawlist($conn, ".");
$found = false;
foreach ($raw_list as $line) {
$parts = preg_split("/\s+/", $line);
$filename = end($parts);
if ($filename === $expected_file) {
$found = true;
break;
}
}
ftp_close($conn);
// 输出结果或发送通知
if ($found) {
echo "文件 $expected_file 存在\n";
} else {
// 这里可以集成邮件或Webhook通知
echo "警告:文件 $expected_file 未找到\n";
// file_get_contents("https://gitbox.net/notify?msg=backup_missing&file=$expected_file");
}
</code>
ftp_rawlist() 返回类似于 UNIX ls -l 的文件信息列表,需手动解析文件名;
date('Ymd') 用于动态生成当天的备份文件名;
可在 else 分支中接入自定义的告警系统,例如调用 https://gitbox.net/notify 这样的 Web API。
假设我们希望每天凌晨 3 点自动检测备份文件,使用以下命令添加 Cron 任务:
crontab -e
然后添加:
0 3 * * * /usr/bin/php /path/to/backup_checker.php >> /var/log/backup_check.log 2>&1
确保 /path/to/backup_checker.php 脚本路径正确,且有执行权限。
日志记录:将检测结果写入日志文件便于追踪;
多 FTP 支持:可封装为函数支持多个 FTP 源;
异常处理:加入重试机制及详细错误日志;
安全性:避免在脚本中明文保存密码,考虑使用 .env 文件或系统变量。
通过 PHP 的 ftp_rawlist 函数配合 Cron 定时任务,我们可以高效实现 FTP 备份文件的自动检测机制。该方案轻量灵活,适合中小型项目快速部署。对于备份可靠性要求较高的系统,此类自动化检测手段是必不可少的保障。