[RESOLU] Traiter seulement les fichiers OK

Eléphanteau du PHP | 11 Messages

21 mai 2014, 11:56

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

Eléphant du PHP | 422 Messages

21 mai 2014, 13:35

hello

regards du côté de la function http://www.php.net/manual/en/function.glob.php

++
toujours faire une recherche sur http://www.php.net et/ou sur http://www.google.fr :)
utiliser http://ideone.com/ pour vos codes :)

ViPHP
xTG
ViPHP | 7331 Messages

21 mai 2014, 13:36

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.

Eléphanteau du PHP | 11 Messages

21 mai 2014, 14:31

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

Eléphant du PHP | 422 Messages

21 mai 2014, 14:49

toujours faire une recherche sur http://www.php.net et/ou sur http://www.google.fr :)
utiliser http://ideone.com/ pour vos codes :)

Eléphanteau du PHP | 11 Messages

21 mai 2014, 15:27

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

ViPHP
xTG
ViPHP | 7331 Messages

21 mai 2014, 16:19

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 ?

Eléphanteau du PHP | 11 Messages

21 mai 2014, 16:29

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. :wink:

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...

Mammouth du PHP | 571 Messages

21 mai 2014, 16:55

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

Eléphanteau du PHP | 11 Messages

22 mai 2014, 10:28

Merci :wink: 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.

Eléphant du PHP | 422 Messages

22 mai 2014, 11:24

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
toujours faire une recherche sur http://www.php.net et/ou sur http://www.google.fr :)
utiliser http://ideone.com/ pour vos codes :)

Eléphanteau du PHP | 11 Messages

22 mai 2014, 12:05

Merci t'es génial,
on va voir si ça marche.
:wink:

Eléphanteau du PHP | 11 Messages

26 mai 2014, 10:57

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
Modifié en dernier par kiko67 le 26 mai 2014, 11:35, modifié 1 fois.

Eléphant du PHP | 422 Messages

26 mai 2014, 11:02

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

++
toujours faire une recherche sur http://www.php.net et/ou sur http://www.google.fr :)
utiliser http://ideone.com/ pour vos codes :)

Eléphanteau du PHP | 11 Messages

26 mai 2014, 11:36

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 :wink:
Modifié en dernier par kiko67 le 26 mai 2014, 13:48, modifié 1 fois.