Page 1 sur 2
Traiter seulement les fichiers OK
Posté : 21 mai 2014, 11:56
par kiko67
Bonjour à tous,
je suis en stage info et
je ne maitrise pas encore php donc besoin d'un coup de main.
J'ai réussi à faire en sorte que un logiciel de supervision m’envoie des alertes de 7 lignes de la forme champs:valeur.
Ces alertes créent à chaque fois un fichier qui a pour nom DateHeureNanosecondes en deux exemplaires, le deuxième a "_OK" à la fin du nom.
Or je dois faire un fichier php qui traite ces fichier pour insérer les données vers une base Mysql.
Comme traiter seulement les fichier qui ont "_OK" dans le nom ?
Merci pour votre aide
Re: Traiter seulement les fichiers OK
Posté : 21 mai 2014, 13:35
par telnes
Re: Traiter seulement les fichiers OK
Posté : 21 mai 2014, 13:36
par xTG
Ou bien si problème de performance (si plusieurs centaines de fichiers) tu utilises readdir() puis tu filtres tes noms de fichier avec stripos() pour rechercher s'il y a "_OK" dedans.
Re: Traiter seulement les fichiers OK
Posté : 21 mai 2014, 14:31
par kiko67
Merci
j'ai finalement opté pour des fichier avec une extension.txt. (Plus simple).
Après avoir ouvert le dossier avec
opendir et readdir
quelles sont les commandes pour selectionner et lire seulement les fichiers qui ont une extension .txt,
les uns après les autres,
avant de les traiter et de rentrer leurs données dans la base mysql ??
Merci
Re: Traiter seulement les fichiers OK
Posté : 21 mai 2014, 14:49
par telnes
Re: Traiter seulement les fichiers OK
Posté : 21 mai 2014, 15:27
par kiko67
Oui ti me renvoies sur le manuel,
mais il n'est pas clair.
Il faut que je fasse un explode avant?
ou que je recherche .txt ?
Il faut specifier la position ?
Les fichiers sont du genre:
1234567890.txt et ils sont dynamiques car le nom change en fonction de la date et de l'heure.
la chaine est donc composée de 23 caractères et .txt
Il n'y a pas une méthode plus simple ?
Qui chercherait que les fichiers contenants .txt ?
Merci pour ton aide
Re: Traiter seulement les fichiers OK
Posté : 21 mai 2014, 16:19
par xTG
glob() te permet de filtrer et de ne récupérer que les fichiers répondant à une expression régulière.
Mais elle est assez consommatrice de ressource.
Une boucle sur la liste des fichiers et un stripos() pour savoir si .txt est détecté ou non dans la chaîne est ce qui coûte le moins cher.
Concernant la manuel... Je vois difficilement comment on peux faire plus clair. Tu te poses la question array VS string mais as-tu regardé le type de paramètre de la fonction ?
Re: Traiter seulement les fichiers OK
Posté : 21 mai 2014, 16:29
par kiko67
Ok je vais essayer avec stripos,
mais tu sais, je ne suis pas encore au niveau de me poser des question sur les ressources consommées par le serveur pour glober sur une dizaine de fichiers par jour.
Merci pour ton aide.
PS: Et je trouve que le manuel est clair pour les initiés comme toi qui connaissent tous les termes qui s'y trouvent mais en vrai on y passe des heures à chercher:
array
string
==
!=
etc...
Re: Traiter seulement les fichiers OK
Posté : 21 mai 2014, 16:55
par yann18
pour vérifier l'extension d'un fichier il y a une fonction php toute faite:
//exemple
$file ='fichier.jpeg'; //nom fichier
$ext = pathinfo( $file, PATHINFO_EXTENSION);//jpeg
Re: Traiter seulement les fichiers OK
Posté : 22 mai 2014, 10:28
par kiko67
Merci

mais,
Le problème c'est que les fichiers texte sont écrits au fur et à mesure dans ce dossier et ont pour nom l'année, le mois, le jour, l'heure, etc..donc une chaine de 23 chiffres puis le .txt.
Je dois donc créer un script qui:
1. scanne le répertoire,
2. ouvre un fichier par ex. 20140522105433123456789.txt
3. traite ce fichier (en insérant les données, formées de CHAMP:VALEUR X 7, dans une table d'une base de données déjà crée)
4. enfin qui le déplace dans un dossier (Archivés)
5. recommence jusque à ce que le dossier soit vide.
Ce script sera lancé par un planificateur de taches.
Panique à bord pour moi, qui débute.
Re: Traiter seulement les fichiers OK
Posté : 22 mai 2014, 11:24
par telnes
hello
le plus simple est de faire ce que tu as fait ; scinder les étapes puis après il faut les tradures en php
<?php
$path = "todo"; //chemin vers le répetoire avec les fichier .txt
$to = "done"; //chemin pour les fichiers traités
$files = glob("$path/*.txt"); //récupère le chemin des fichiers dans un tableau
foreach($files as $file){ // pour chaque fichier dans le tableau on fait
echo "traitement de $file <br />\n";
//récupère le contenu
$content = file_get_contents($file);
//actions
//déplace le fichier
$filename = basename($file); //nom du fichier
rename($file,"$to/$filename"); //déplace
}
?>
foreach =>
http://www.php.net/manual/fr/control-st ... oreach.php
Re: Traiter seulement les fichiers OK
Posté : 22 mai 2014, 12:05
par kiko67
Merci t'es génial,
on va voir si ça marche.

Re: Traiter seulement les fichiers OK
Posté : 26 mai 2014, 10:57
par kiko67
Le script qui
1. se connecte à la base
2. attribue des valeurs aux dossiers
3. Cherche dans ces dossiers tous les fichiers ayant comme nom 23 chiffres et l'extension xml
4 envoye les données vers la base
5. transfere les fichiers vers un autre dossier
NE MARCHE PAS:
Code : Tout sélectionner
<?php
set_time_limit(0);
echo "starting";
//mysql connection
error_reporting(E_ALL ^ E_NOTICE);
function connectMaBase(){
$connexion = mysql_connect('localhost','root','kiko67');
mysql_select_db('nagios_to_parcpc');
if (mysql_select_db ('nagios_to_parcpc', $connexion) == false)
die ("Serveur inaccessible");
}
echo "connecte a la base <br /><br />";
// on atrribue des variables au dossiers
$dossierencours="C:\Documents and Settings\900204\Bureau\Test";
$dossiertraite="C:\Documents and Settings\900204\Bureau\Traités";
// On ouvre le dossier a traiter
$dossier = opendir ($dossierencours);
// on lit le dossier que on a chargé
$lecture = readdir ($dossier);
// on selectionne que les fichiers xml avec des noms de 23 nombre
$liste = new RegexIterator(new DirectoryIterator($lecture,'/^[0-9]{23}\.xml$/i');
if (!empty ($liste))
exit;
else{
// pour chaque fichier on extrait le contenu
foreach ($liste as $file)
$contenu = file_get_contents($file);
}
mysql_query("INSERT INTO notifications (Alerte, Type_Notification, Service, Hote, Adresse_IP, Etat, ID_Etat, Descriptif, Date_Heure)
VALUES ('$alerte', '$typenotif', '$service', '$hote', '$adresse_ip', '$etat', '$descr', '$timestamp')");
$filename = basename($file); //nom du fichier
rename($file,"$dossiertraite/$filename_fini"); //déplace
php?>
Les données ne sont pas inserées dans la base.
Il me dit erreur à la ligne correspondante à:
$liste = new RegexIterator(new DirectoryIterator($lecture,'/^[0-9]{23}\.xml$/i')
Pourquoi ?
Merci
Re: Traiter seulement les fichiers OK
Posté : 26 mai 2014, 11:02
par telnes
hello
tu devrais faire la méthode du debugger à l'arrache

qui consiste à mettre des echo et des print_r() dans le code pour voir si les étapes se déroule comme prévus
++
Re: Traiter seulement les fichiers OK
Posté : 26 mai 2014, 11:36
par kiko67
hello
tu devrais faire la méthode du debugger à l'arrache

qui consiste à mettre des echo et des print_r() dans le code pour voir si les étapes se déroule comme prévus
++
Ce que je viens de faire.
Alors j'ai remplacé le regexp par du glob et, de ce coté là, ca a l'air de tourner.
Par contre dans le dernier log j'ai:
Parse error : syntax error unexpected end of file in .../monscript at line 31
Là ligne où il y a
?>
Code : Tout sélectionner
<?php
set_time_limit(0);
//mysql connection
error_reporting(E_ALL ^ E_NOTICE);
function connectMaBase(){
$connexion = mysqli_connect('localhost','root','');
mysqli_select_db('nagios_to_parcpc');
if (!$connexion) {
die('Impossible de se connecter: '. mysql_error());
}
echo "connection a la base OK";
// on atrribue des variables au dossiers
$dossierencours="C:\Documents and Settings\900204\Bureau\Test";
$dossiertraite="C:\Documents and Settings\900204\Bureau\Traités";
// On ouvre le dossier a traiter
$dossier = opendir ($dossierencours);
// on selectionne que les fichiers xml avec des noms de 23 nombre
$files = glob("$dossier/*.xml");
if (!empty ($files))
exit;
else{
// pour chaque fichier on extrait le contenu
foreach ($files as $file)
$contenu = file_get_contents($file);
}
mysql_query("INSERT INTO notifications (Alerte, Type_Notification, Service, Hote, Adresse_IP, Etat, ID_Etat, Descriptif, Date_Heure) VALUES ('$alerte', '$typenotif', '$service', '$hote', '$adresse_ip', '$etat', '$descr', '$timestamp')");
$filename = basename($file); //nom du fichier
rename($file,"$dossiertraite/$filename_fini"); //déplace
?>
Merci pour votre aide
