當前位置: 首頁> 最新文章列表> 通過ftp_rawlist 實現FTP 目錄快照對比功能

通過ftp_rawlist 實現FTP 目錄快照對比功能

gitbox 2025-05-26

在日常的運維或網站管理中,我們經常會遇到這樣一個需求:監控FTP服務器上的某個目錄文件是否有新增、修改或刪除操作。雖然可以使用文件同步工具或者高級監控系統來實現,但如果我們希望用一種更輕量、靈活的方式實現目錄快照比對,PHP 提供的ftp_rawlist函數便是一種非常實用的方案。

一、什麼是ftp_rawlist?

ftp_rawlist是PHP 提供的FTP 操作函數之一,它允許我們獲取遠程目錄的原始目錄列表。相比於ftp_nlist只返回文件名, ftp_rawlist返回的是類似Unix ls -l命令輸出的詳細信息,包括權限、文件大小、時間戳等。

通過對兩個時點抓取的ftp_rawlist結果進行比對,我們就可以輕鬆實現“目錄快照”對比,識別哪些文件發生了變化。

二、實現邏輯簡述

  1. 連接FTP服務器並登錄

  2. 抓取目標目錄的文件列表(即快照)

  3. 保存快照到本地文件

  4. 在下一次運行時重新抓取,並與上次快照對比

  5. 輸出變動內容(新增、刪除、修改)

三、PHP實現示例

以下是一個完整的PHP腳本示例,演示如何抓取FTP快照並與上次快照進行比對:

<code> ```php <?php

// FTP 配置
$ftp_host = "ftp.gitbox.net";
$ftp_user = "ftp_user";
$ftp_pass = "ftp_password";
$ftp_dir = "/htdocs/";
$snapshot_file = DIR . '/last_snapshot.txt';

// 連接並登錄
$conn = ftp_connect($ftp_host);
if (!$conn) {
die("無法連接FTP服務器");
}
if (!ftp_login($conn, $ftp_user, $ftp_pass)) {
ftp_close($conn);
die("FTP登錄失敗");
}

// 獲取當前快照
ftp_chdir($conn, $ftp_dir);
$rawlist = ftp_rawlist($conn, ".");
ftp_close($conn);

// 解析快照成結構化數組
function parse_rawlist($rawlist) {
$snapshot = [];
foreach ($rawlist as $line) {
$parts = preg_split("/\s+/", $line, 9);
if (count($parts) < 9) continue;
$name = $parts[8];
$info = [
'perm' => $parts[0],
'size' => $parts[4],
'date' => "{$parts[5]} {$parts[6]} {$parts[7]}"
];
$snapshot[$name] = $info;
}
return $snapshot;
}

$current_snapshot = parse_rawlist($rawlist);

// 加載上次快照
$previous_snapshot = file_exists($snapshot_file) ? unserialize(file_get_contents($snapshot_file)) : [];

// 對比快照
$added = array_diff_key($current_snapshot, $previous_snapshot);
$deleted = array_diff_key($previous_snapshot, $current_snapshot);
$modified = [];

foreach ($current_snapshot as $file => $info) {
if (isset($previous_snapshot[$file])) {
if ($info['size'] !== $previous_snapshot[$file]['size'] ||
$info['date'] !== $previous_snapshot[$file]['date']) {
$modified[$file] = $info;
}
}
}

// 輸出變動結果
echo "=== 文件變動報告===\n";

if ($added) {
echo "\n[新增文件]:\n";
foreach ($added as $file => $info) {
echo " + $file\n";
}
}

if ($deleted) {
echo "\n[刪除文件]:\n";
foreach ($deleted as $file => $info) {
echo " - $file\n";
}
}

if ($modified) {
echo "\n[修改文件]:\n";
foreach ($modified as $file => $info) {
echo " * $file\n";
}
}

// 保存當前快照
file_put_contents($snapshot_file, serialize($current_snapshot));

 </code>

## 四、實用建議

1. **定時執行**:可通過 `cron` 或 Windows 任務計劃每小時/每天運行一次腳本,定期生成快照。
2. **通知機制**:可以將變動信息通過郵件或Webhook方式發送通知,及時獲知風險操作。
3. **過濾規則**:腳本中可加入白名單或忽略規則,例如跳過 `.log`、`.tmp` 文件。

## 五、總結

通過 `ftp_rawlist` 獲取目錄原始結構,再加以結構化、序列化和對比,我們可以用極小的成本實現類似“目錄監控”的功能。這種方式特別適用於小型項目、老舊系統、或僅需臨時監控的場景。既節省資源,又靈活高效,是PHP在輕量級自動化中的一個實用“黑科技”。