[RESOLU] Fonction de récursivité, scanner répertoire FTP

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] Fonction de récursivité, scanner répertoire FTP

Re: [RESOLU] Fonction de récursivité, scanner répertoire FTP

par ecumastor » 28 nov. 2012, 16:26

Bon allez pour la forme :
L'idée de Saian, sortir les infos de connection de la fonction, est la bonne. Ca va dix fois plus vite maintenant.

Mon code :
<?
function ecrire_log($texte){
	$fp=fopen('fichier_logs.txt','a');
	fputs($fp,$texte."\n");
	fclose($fp);
}

function scanner($conn_id, $repertoire){
	$element = ftp_nlist($conn_id, $repertoire);
	$compteur=count($element);//echo"VERIF compteur : $compteur<br>";
	for($i=0;$i<=$compteur-1;$i++){
		$cible=$element[$i];
		$res = ftp_size($conn_id,$element[$i]);
		$cible=$element[$i];
		if($res=="-1"){ // c'est un repertoire
			scanner($conn_id,"./$cible");
		}
		else{ // c'est un fichier
			$time_modif=ftp_mdtm($conn_id, $cible);
			$date_cible=date("d/m/y",$time_modif);
			$intervalle=mktime()-$time_modif;
			$delai=7*24*3600;
			if($intervalle<$delai){
				ecrire_log(" - [$date_cible] $cible");
			}
		}
	}
}

function verifier_sauvegarde($ftp_user_name,$ftp_user_pass){
	$repertoire=".";
	$ftp_server="***********.net";
	$date_jour=strftime("%d/%m/%y");
	$heure_jour=strftime("%H:%M:%S");
	ecrire_log("\r\r[$date_jour - $heure_jour] DEMARRAGE SAUVEGARDE DE $ftp_user_name\r");
	$conn_id = ftp_connect("$ftp_server");
	$login_result = ftp_login($conn_id, "$ftp_user_name", "$ftp_user_pass");
	scanner($conn_id,$repertoire);
	ecrire_log("[$date_jour - $heure_jour] FIN SAUVEGARDE DE <b>$ftp_user_name</b>");
	ftp_quit($conn_id);
}

verifier_sauvegarde("***********","***********");
verifier_sauvegarde("***********","***********");
verifier_sauvegarde("***********","***********");
verifier_sauvegarde("***********","***********");
verifier_sauvegarde("***********","***********");
verifier_sauvegarde("***********","***********");
?>
J'ai ajouté un petit fichier log qui stocke les nouveaux fichiers trouvés dans la sauvegarde.

Jusqu'ici tout va bien :)

Re: [RESOLU] Fonction de récursivité, scanner répertoire FTP

par Saian » 28 nov. 2012, 12:22

Il suffit de passer la connexion en paramètre comme dans mon deuxième exemple ou de la déclarer en global dans la fonction.
Enfin bref, oui si tu sorts les deux lignes juste comme ça sans rien faire d'autre, forcément ça ne marche plus mais y a vraiment peu de chose à faire pour que ça fonctionne.

Re: [RESOLU] Fonction de récursivité, scanner répertoire FTP

par ecumastor » 28 nov. 2012, 11:02

Dans ton code tu reconnectes à chaque appel de la fonction récursive.
Probablement que le traitement sera moins long si tu ne connectes qu'une seule fois avant le premier appel.
Salut Saian,

Effectivement, mais si je sors
$conn_id = ftp_connect("******.net");
ftp_login($conn_id,$identifiant,$password);
de la fonction, ça ne fonctionne plus.

Maintenant j'ai testé ce programme cette nuit via une tâche Cron. Le fonctionnement est bon.
Il ne me reste plus qu'à améliorer maintenant.

David

Re: [RESOLU] Fonction de récursivité, scanner répertoire FTP

par Saian » 27 nov. 2012, 17:05

Dans ton code tu reconnectes à chaque appel de la fonction récursive.
Probablement que le traitement sera moins long si tu ne connectes qu'une seule fois avant le premier appel.

Re: Fonction de récursivité, scanner répertoire FTP

par ecumastor » 27 nov. 2012, 16:55

Merci Saian, ça marche bien.
En m'inspirant de ta première réponse, j'en suis arrivé à ça :
<?
function recursiveDirectories($repertoire){
	$conn_id = ftp_connect("********.net");
	ftp_login($conn_id,"david","**********");  
	$element = ftp_nlist($conn_id, $repertoire);
	$compteur=count($element);//echo"VERIF compteur : $compteur<br>";
	for($i=0;$i<=$compteur-1;$i++){
		$cible=$element[$i];
		$res = ftp_size($conn_id,$element[$i]);//echo"VERIF res : $res<br>";
		$cible=$element[$i];
		if($res=="-1"){
			recursiveDirectories("./$cible");
		}
		else{
			$time_modif=ftp_mdtm($conn_id, $cible);
			$intervalle=mktime()-$time_modif;
			if($intervalle>=172800){
				echo "Fichier vieux de plus de deux jours: $cible $intervalle<br>";
			}
			if($intervalle<172800){
				echo "Fichier récent : $cible<br>";
			}
		}
	}
}
recursiveDirectories('.');
?>
Ca marche très bien !
Tu m'a donné ce qui me manquait : la façon d'appeler la même fonction tant qu'il y a des trucs à voir.
Donc merci !

Je me rends compte qu'il faut des plombes pour scanner mes sauvegardes (+ de 5Go), autant passer par Filezilla et ses petites fonctions... mais j'ai 15 collaborateurs sur mon lieu de travail, une sauvegarde sur chaque ordi avec Cobian. Un truc automatique, qui va surveiller chaque nuit les sauvegardes, va me faire gagner du temps (si ça marche bien....) ! :?

Re: Fonction de récursivité, scanner répertoire FTP

par Saian » 27 nov. 2012, 16:46

Pas forcément au must (notamment l'appel de ftp_nlist même si $repertoire est un fichier) mais ça doit être fonctionnel (sauf erreur de syntaxe ou de paramètre ou de logique n'ayant pas testé le code) :
function recursiveDirectories($conn_id, $repertoire, $level)
{
  $level++;
  $element = ftp_nlist($conn_id, $repertoire);
  if($element) {
    $compteur = count($element); echo"VERIF compteur : $compteur<br>";
    for($i = 0; $i < $compteur; $i++){
      for($j = 1; $j < $level; $j++)
        echo '-';
      echo " <b>Element $i : </b>".$element[$i]."<br/>";
      recursiveDirectories($conn_id, $repertoire.'/'.$element[$i], $level);
    }
  }
}

$repertoire=".";
$ftp_server="*********.net";
$ftp_user_name="david";
$ftp_user_pass="**********";
$conn_id = ftp_connect("$ftp_server");
$login_result = ftp_login($conn_id, "$ftp_user_name", "$ftp_user_pass");
recursiveDirectories($conn_id, $repertoire, 0);
ftp_quit($conn_id);

Re: Fonction de récursivité, scanner répertoire FTP

par Saian » 27 nov. 2012, 16:00

Salut, tu dois faire un truc dans le genre avec un premier appel sur le premier répertoire :
function recursiveDirectories($repertoire)
{
  $element = ftp_nlist($conn_id, $repertoire);
  $compteur=count($element);echo"VERIF compteur : $compteur<br>";
  for($i=0;$i<=$compteur-1;$i++){
    echo "<b>Element $i : </b>".$element[$i]."<br>";
    if(/* $element[$i] est un répertoire */)
      recursiveDirectories($repertoire.'/'.$element[$i]);
  }
}
recursiveDirectories('repertoire/principal');
Bien sur il faut prévoir le passage de tous les paramètres nécessaires et bien écrire la condition si élément i est un répertoire. Le code n'est pas fonctionnel ainsi.
Tu peux également prévoir un paramètre de niveau que tu incrémentes à chaque appel de recursiveDirectories afin par exemple d'ajouter des - quand tu echo le nom de l'élément.

Fonction de récursivité, scanner répertoire FTP

par ecumastor » 27 nov. 2012, 15:52

Bonjour à tous,

Voici mon petit problème du jour : je fais des sauvegardes de mes répertoires sur FTP avec Cobian. Pour vérifier si tout se fait correctement je cherche à développer une machine qui scanne tous les répertoires sur le serveur via FTP, puis regarde pour chaque fichier sa date de modification, et envoie un email si cette date est trop lointaine...

Avec un programme du genre :
<?php
$repertoire=".";
$ftp_server="*********.net";
$ftp_user_name="david";
$ftp_user_pass="**********";
$conn_id = ftp_connect("$ftp_server");
$login_result = ftp_login($conn_id, "$ftp_user_name", "$ftp_user_pass");
$element = ftp_nlist($conn_id, $repertoire);
$compteur=count($element);echo"VERIF compteur : $compteur<br>";
for($i=0;$i<=$compteur-1;$i++){
	echo "<b>Element $i : </b>".$element[$i]."<br>";
}
ftp_quit($conn_id);
?>
J'obtiens :
VERIF compteur : 5
Element 0 : STOCK site_ovh
Element 1 : STOCK guide rando vendu a l'accueil
Element 2 : STOCK site_mobile
Element 3 : STOCK relais bucherons
Element 4 : STOCKAGE
Mais ce n'est pas récursif. ce programme ne scanne que le répertoire racine. Il faudrait qu'il se répète dans chaque répertoire et sous-répertoire rencontré...

Quelqu'un aurait-il sous la main un script sur lequel je pourrais m'appuyer ?

Merci !

David.