在日常的運維或網站管理中,我們經常會遇到這樣一個需求:監控FTP服務器上的某個目錄文件是否有新增、修改或刪除操作。雖然可以使用文件同步工具或者高級監控系統來實現,但如果我們希望用一種更輕量、靈活的方式實現目錄快照比對,PHP 提供的ftp_rawlist函數便是一種非常實用的方案。
ftp_rawlist是PHP 提供的FTP 操作函數之一,它允許我們獲取遠程目錄的原始目錄列表。相比於ftp_nlist只返回文件名, ftp_rawlist返回的是類似Unix ls -l命令輸出的詳細信息,包括權限、文件大小、時間戳等。
通過對兩個時點抓取的ftp_rawlist結果進行比對,我們就可以輕鬆實現“目錄快照”對比,識別哪些文件發生了變化。
連接FTP服務器並登錄
抓取目標目錄的文件列表(即快照)
保存快照到本地文件
在下一次運行時重新抓取,並與上次快照對比
輸出變動內容(新增、刪除、修改)
以下是一個完整的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在輕量級自動化中的一個實用“黑科技”。