在日常服務器維護中,定期備份至遠程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 備份文件的自動檢測機制。該方案輕量靈活,適合中小型項目快速部署。對於備份可靠性要求較高的系統,此類自動化檢測手段是必不可少的保障。