現在の位置: ホーム> 最新記事一覧> FTP_RAWLISTを介してFTPディレクトリスナップショット比較関数を実装します

FTP_RAWLISTを介してFTPディレクトリスナップショット比較関数を実装します

gitbox 2025-05-26

毎日の操作とメンテナンスまたはウェブサイトの管理では、多くの場合、必要性が発生します。FTPサーバー上のディレクトリファイルが追加、変更、削除されたかどうかを監視します。ファイル同期ツールまたは高度な監視システムを使用して実装できますが、より軽量で柔軟な方法でディレクトリスナップショットの比較を実装する場合、PHPが提供するFTP_RAWLIST機能は非常に実用的なソリューションです。

1。FTP_RAWLISTとは何ですか?

FTP_RAWLISTは、PHPが提供するFTP操作関数の1つであり、リモートディレクトリの元のディレクトリリストを取得できます。ファイル名のみを返すFTP_NLISTと比較して、 FTP_RAWLISTは、権限、ファイルサイズ、タイムスタンプなどを含むUNIX LS -Lコマンドの出力と同様の詳細情報を返します。

2つの時点でキャプチャされたFTP_RAWLISTの結果を比較することにより、「ディレクトリスナップショット」の比較を簡単に実現し、どのファイルが変更されたかを特定できます。

2。実装ロジックの簡単な説明

  1. FTPサーバーに接続してログインします

  2. ターゲットディレクトリのファイルリストをクロールします(つまり、スナップショット)

  3. スナップショットをローカルファイルに保存します

  4. 次の実行でリクルールし、最後のスナップショットと比較してください

  5. 出力の変更(追加、削除、変更)

3。PHP実装の例

以下は、FTPスナップショットをつかみ、最後のスナップショットと比較する方法を示す完全なPHPスクリプトの例です。

<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)継続;
$ name = $ parts [8];
$ info = [
'perm' => $ parts [0]、
「サイズ」=> $パーツ[4]、
'date' => "{$ parts [5]} {$ parts [6]} {$ parts [7]}"
];
$ snapshot [$ name] = $ info;
}
$ snapshotを返します。
}

$ current_snapshot = parse_rawlist($ rawlist);

//最後のスナップショットをロードします
$ fortion_snapshot = file_exists($ snapshot_file)? Unserialize(file_get_contents($ snapshot_file)):[];

//比較スナップショット
$ add = array_diff_key($ current_snapshot、$ previous_snapshot);
$ deleted = array_diff_key($ previor_snapshot、$ current_snapshot);
$ modified = [];

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

//出力の変更結果
echo "===ファイル変更レポート=== \ n";

if($ added){
echo "\ n [新しいファイル]:\ n";
foreach($は$ file => $ info)として追加){
echo " + $ file \ n";
}
}

if($削除){
echo "\ n [ファイルを削除]:\ n";
foreach($削除$ file => $ info){
echo " -$ file \ n";
}
}

if($ modified){
echo "\ n [ファイルを変更]:\ n";
foreach($ file => $ infoとして変更){
echo " * $ file \ n";
}
}

//現在のスナップショットを保存します
file_put_contents($ snapshot_file、serialize($ current_snapshot));

 </code>

## 4、実用的な提案

1. **時限実行**:利用可能 `cron` または Windows ミッション計画時間ごと/スクリプトを1日1回実行します,定期的にスナップショットを生成します。
2. **通知メカニズム**:可以将变动信息合格邮件またはWebhook通知を送信します,タイムリーにリスク操作を通知します。
3. **フィルタリングルール**:脚本中可加入白名单または忽略规则,たとえば、スキップ `.log`、`.tmp` 書類。

## 五、要約します

合格 `ftp_rawlist` 元のディレクトリ構造を取得します,構造化、シリアル化と比較,同様のコストを非常に少ないコストで達成できます“ディレクトリ監視”関数。この方法は、特に小さなプロジェクトに適しています、古いシステム、または仅需临时监控的场景。リソースを保存します,柔軟で効率的です,はいPHP軽量自動化における実用的な使用“ブラックテクノロジー”。