Position actuelle: Accueil> Derniers articles> Implémentez la fonction de comparaison de l'instantané du répertoire FTP via FTP_RAWLIST

Implémentez la fonction de comparaison de l'instantané du répertoire FTP via FTP_RAWLIST

gitbox 2025-05-26

Dans le fonctionnement et la maintenance quotidiens ou la gestion du site Web, nous rencontrons souvent un besoin: surveiller si un fichier de répertoire sur le serveur FTP a été ajouté, modifié ou supprimé. Bien qu'il puisse être implémenté à l'aide d'outils de synchronisation de fichiers ou de systèmes de surveillance avancés, si nous souhaitons implémenter la comparaison des instantanés de répertoire d'une manière plus légère et plus flexible, la fonction FTP_RAWLIST fournie par PHP est une solution très pratique.

1. Qu'est-ce que FTP_RAWLIST?

FTP_RAWLIST est l'une des fonctions de fonctionnement FTP fournies par PHP, qui nous permet d'obtenir la liste des répertoires distants d'origine. Par rapport à FTP_NList qui ne renvoie que les noms de fichiers, FTP_RAWLIST renvoie des informations détaillées similaires à la sortie de la commande UNIX LS -L , y compris les autorisations, la taille du fichier, les horodatages, etc.

En comparant les résultats FTP_RAWLIST capturés en deux points, nous pouvons facilement réaliser la comparaison "Snaphot du répertoire" et identifier quels fichiers ont changé.

2. Brève description de la logique d'implémentation

  1. Connectez-vous au serveur FTP et connectez-vous

  2. Crawer la liste des fichiers du répertoire cible (c'est-à-dire, instantané)

  3. Enregistrer les instantanés dans le fichier local

  4. Recraw sur la prochaine course et comparer avec le dernier instantané

  5. Modifications de sortie (ajouter, supprimer, modifier)

3. Exemple d'implémentation PHP

Voici un exemple complet de script PHP qui montre comment saisir un instantané FTP et le comparer au dernier instantané:

<code> `` `php <? php

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

// Connectez-vous et connectez-vous
$ conn = ftp_connect ($ ftp_host);
if (! $ Conn) {
Die ("Impossible de se connecter au serveur FTP");
}
if (! ftp_login ($ Conn, $ ftp_user, $ ftp_pass)) {
ftp_close ($ Conn);
Die ("FTP Login a échoué");
}

// Obtenez l'instantané actuel
FTP_CHDIR ($ Conn, $ ftp_dir);
$ rawlist = ftp_rawlist ($ Conn, ".");
ftp_close ($ Conn);

// analyse les instantanés dans des tableaux structurés
fonction parse_rawlist ($ rawlist) {
$ snapshot = [];
foreach ($ rawlist comme $ line) {
$ Parts = preg_split ("/ \ s + /", $ line, 9);
si (compter ($ parties) <9) continue;
$ name = $ Parts [8];
$ info = [
'perm' => $ parties [0],
'Size' => $ Parts [4],
'date' => "{$ Parts [5]} {$ Parts [6]} {$ Parts [7]}"
]]
$ snapshot [$ name] = $ info;
}
retourner $ snapshot;
}

$ current_snapshot = parse_rawlist ($ rawlist);

// Chargez le dernier instantané
$ précédemment_snapshot = file_exists ($ snapshot_file)? Unserialize (file_get_contents ($ snapshot_file)): [];

// Comparaison des instantanés
$ ajouté = array_diff_key ($ current_snapshot, $ précédemment_snapshot);
$ deleted = array_diff_key ($ PREVER_SNAPSHOT, $ current_snapshot);
$ modifié = [];

foreach ($ current_snapshot en tant que fichier $ => $ info) {
if (isset ($ précédemment_snapshot [$ file])) {
if ($ info ['size']! == $ PREVER_SNAPSHOT [$ file] ['Size'] ||
$ info ['date']! == $ PREMER_SNAPSHOT [$ file] ['date']) {
$ modifié [$ file] = $ info;
}
}
}

// Résultats du changement de sortie
echo "=== Rapport de changement de fichier === \ n";

if ($ ajouté) {
echo "\ n [nouveau fichier]: \ n";
foreach ($ ajouté en tant que fichier $ => $ info) {
echo "+ $ file \ n";
}
}

if ($ supprimé) {
echo "\ n [supprimer le fichier]: \ n";
foreach ($ supprimé en fichier $ => $ info) {
echo "- $ file \ n";
}
}

if ($ modifié) {
echo "\ n [modifier le fichier]: \ n";
foreach ($ modifié en fichier $ => $ info) {
echo "* $ file \ n";
}
}

// Enregistrer l'instantané actuel
file_put_contents ($ snapshot_file, serialize ($ current_snapshot));

 </code>

## Quatre、Suggestions pratiques

1. **Exécution chronométrée**:Disponible `cron` ou Windows Planification de mission horaire/Exécutez le script une fois par jour,Générer des instantanés régulièrement。
2. **Mécanisme de notification**:可以将变动信息passer邮件ouWebhookEnvoyer des notifications,Informer les opérations des risques en temps opportun。
3. **Règles de filtrage**:脚本中可加入白名单ou忽略规则,Par exemple, sauter `.log`、`.tmp` document。

## cinq、Résumer

passer `ftp_rawlist` Obtenez la structure du répertoire d&#39;origine,Structuré、Sérialisation et comparaison,Nous pouvons obtenir des coûts similaires à un très petit coût“Surveillance du répertoire”Fonctions。Cette méthode convient particulièrement aux petits projets、Ancien système、ou仅需临时监控的场景。Économiser des ressources,Flexible et efficace,OuiPHPUne utilisation pratique dans l&#39;automatisation légère“Technologie noire”。