Exploitation d'un fichier Log - Garder que 2 jours

Mammouth du PHP | 959 Messages

14 avr. 2009, 23:31

Bonsoir tout le monde :)

Depuis toute la soirée, je réfléchi et j'essaie de retranscrire ça en PHP, mais je n'ai pas l'air d'y parvenir :P

Voilà se que je veux faire : J'ai un fichier Log où il y a plusieurs jours à l'intérieur, je souhaiterai prendre seulement les 2 plus récents jours. Le problème, c'est l'endroit où mettre la "coupure" entre mes 2 jours et le reste du Log (Qui m'ai un peu inutile, et ça risquerait de prendre du temps à charger...). Sachant qu'il doit aussi y avoir une marque (Genre, un <hr />) entre mes 2 jours que je récupère.

Je ne sais pas trop comment m'y prendre ...

Voici comment le Log est disposé (Un petit extrait heureusement :P) :

Code : Tout sélectionner

[20:55:48] Texte texte ... [20:56:52] Texte texte ... [20:58:35] Texte texte ... [20:59:41] Texte texte ... [21:01:12] Texte texte ... [21:05:58] Texte texte ... [21:11:22] Texte texte ... [21:13:03] Texte texte ...
Voilà, mon code est un peu brouillon, mais je voudrai surtout que vous partiez de vos idées, sans avoir vue ma technique que j'ai plutôt utilisée. :P
J'utilise bien évidemment une While :P

Quels sont vos idées ? Des exemples ? :)

Merci beaucoup ! :D

ViPHP
ViPHP | 5924 Messages

14 avr. 2009, 23:40

Tu parcours le fichier en ordre inverse, à la recherche du motif \n\[\d{2}:\d{2}:\d{2}\]. Le premier des trois nombres est décroissant, à chaque fois que tu as une rupture de sa décroissance, c'est que tu as un nouveau jour.

Mammouth du PHP | 959 Messages

15 avr. 2009, 17:35

Je me suis basé sur la même technique :)

Mais j'arrive pas trop à détecter la rupture de décroissance dans la boucle while :?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

15 avr. 2009, 17:39

Utilise une variable temporaire dans laquelle tu stockes ton heure... à chaque fois tu compares l'heure de la ligne courrante avec celle stockée dans ta variable et si l'heure de la ligne courrante est supérieure à l'heure de la ligne précédente, c'est que tu as changé de jour.

Après suffit juste d'un compteur pour savoir combien de jour tu veux remonter ainsi :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

ViPHP
ViPHP | 3300 Messages

15 avr. 2009, 17:39

prends tes valeurs et passes les dans un mktime et compare avec un mktime qui fait aujourd'hui - 2 récupérer un timestamp dans chacun et fait un bete if($cur>$twodaysago). grosso modo ca devrait marcher sans $etre trop pourri, mais c'est surtout grâce à la bonne remarque de sekil qui dit de parcourir du plus récent au plus vieux. :)
Fait du php depuis que ca existe ou presque :)

Mammouth du PHP | 959 Messages

15 avr. 2009, 18:02

Bon, voilà se que ça donne, j'avais déjà réussi à faire ça, mais il y a 2 problèmes :
1) Il faut marquer à l'endroit de la première ligne du deuxième jour, là, il me marque à chaque fois que je change d'heure...

2) Comment faire pour marquer avec un <hr /> pile poil à la fin du premier jour ? Donc pour couper le premier jour du deuxième jour, et pour enlever la partie vieille de 2 jours du Log.

Voici le code :
		$lines = file(LOG_PATH);
		$line_number = count($lines)-1;
		
		$i = $line_number;
		
		while( ($i <= $line_number) && ($i >= 0) ){ // Je préfère faire une While en décrémentation, comme on lis en sens inverse, t'en qu'à faire :P
		
			list($hour, $minut, $second) = explode(':', substr($lines[$i], 1, 8)); // Récupération des horaires
			
			
			if( ($line_number-$i) == 0 ){ // Si c'est la 1ère execution de la boucle
				$conserve_Premiere_Heure = $hour; // On enregistre la première heure dans une variable
				
			} else {
			
				if( $hour < $conserve_Premiere_Heure ){ // Si l'heure courante est inférieure à la 1ère heure enregistrée ...
				
					$conserve_Premiere_Heure = $hour; // On enregistre alors l'heure dans la même variable
					$contents .= '<b style="color:#FF0000;">Enregistrée</b>';

				} else {

					$contents .=  '<b style="color:#00FF00;">'.$hour.' > '.$conserve_Premiere_Heure.'</b>';
					
				}

			}

			
			$contents .= ' '.($line_number-$i).' : '.$hour.':'.$minut.':'.$second.'<br />';
			
			$i--; // Décrémentation pour la While
		}
Je précise qu'avec ça, on obtient un Log à l'envers (Première ligne la plus récente et dernière ligne la plus ancienne...)

Merci de votre aide ! :)

Mammouth du PHP | 959 Messages

21 avr. 2009, 23:59

Up, je n'ai toujours pas trouvé comme faire :?

Merci beaucoup :)