Précédent   Forum des professionnels en informatique > PHP > Langage > Fichiers
Fichiers Forum d'entraide sur les fichiers avec PHP. Avant de poster -> FAQ fichiers et Sources fichiers
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/09/2006, 20h20   #1
Invité de passage
 
Inscription : septembre 2006
Messages : 15
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 15
Points : 3
Points : 3
Par défaut file_get_contents: ouvrir un gros fichier

Bonjour à vous tous!

J'aurais besoin de votre aide concernant un problème avec la fonction PHP file_get_contents. Je vous met en contexte:

J'ai besoin d'analyser un fichier .log afin de ressortir des statistiques précises sur un site Web. J'ouvrais donc le fichier avec la fonction file_get_contents() et je «*parsais*» la chaîne. Génial!... jusqu'à ce que le site Web gagne en popularité et que le .log devienne plusieurs méga-octets de taille! Ho là là!! Avec 3 Mo, il ne semblait pas y avoir de problème, mais maintenant à 7 Mo, juste le fait d'Affecter le .log dans une chaîne fait planter le site Web.

Auriez-vous une alternative de fonction ou une idée afin de seulement mettre les lignes du .log nécessaires à mes statistiques?

Merci beaucoup de votre temps.
blirette est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2006, 21h32   #2
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Et en le lisant ligne par ligne c'est pas mieux ?


Julp.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2006, 22h03   #3
Invité de passage
 
Inscription : septembre 2006
Messages : 15
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 15
Points : 3
Points : 3
Citation:
Envoyé par julp
Et en le lisant ligne par ligne c'est pas mieux ?
Et quelle fonction me permettrait de consulter le fichier seulement une ligne à la fois? Est-ce que je peux soumettre ce genre de paramètre avec «*file_get_contents*»?

Je ne suis pas trop sûr de comprendre l'info que php.net me donne:

string file_get_contents ( string filename [, bool use_include_path [, resource context [, int offset [, int maxlen]]]] )

Merci de votre aide!
blirette est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2006, 22h40   #4
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Citation:
Envoyé par blirette
Et quelle fonction me permettrait de consulter le fichier seulement une ligne à la fois?
fgets.

Citation:
Envoyé par blirette
Est-ce que je peux soumettre ce genre de paramètre avec «*file_get_contents*»?
Non.


Julp.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2006, 16h42   #5
Invité de passage
 
Inscription : septembre 2006
Messages : 15
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 15
Points : 3
Points : 3
Wow, génial! Merci beaucoup!!

Voici la fonction si quelqu'un veut «*parser*» un log de statistique qui a cette forme:

2006-09-18 08:37:18 66.46.188.194 64.18.191.248 80 GET /fr/(email)353_17(/email) - 404 4203 602 31 Mozilla/4.0+(compatible;+MSIE+6.0;+Windows+NT+5.0) - http://www.apple.com

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$handle = @fopen("lienversvotrefichier.log", "r");
if($handle)
	{
	while(!feof($handle))
		{
		$buffer = fgets($handle, 4096);
 
		// vérifie si c'est une statistique
		if(strpos($buffer, "(email)") !== false)
			{
			// va chercher le début des infos
			$datOuverture = substr($buffer, 0, 10);
			$timOuverture = substr($buffer, 11, 8);
			$strClientMailing = substr($buffer, strpos($buffer, "(email)") + 7, strpos($buffer, "(/email)") - strpos($buffer, "(email)") - 7);
 
			$aValeursOuverture = explode("_", $strClientMailing);
			$idClient = $aValeursOuverture[0];
			$idMailing = $aValeursOuverture[1];
 
			echo('<p>$datOuverture['.$datOuverture.'] || $timOuverture['.$timOuverture.'] || $idClient['.$idClient.'] || $idMailing['.$idMailing."]<p>\n");
			};
		};
	fclose($handle);
	};
blirette est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2006, 16h58   #6
Membre émérite

 
Avatar de FCYPBA
 
Inscription : novembre 2004
Messages : 735
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : novembre 2004
Messages : 735
Points : 924
Points : 924
Si c'est un fichier de log formatté ( tout le temps le meme format ), tu pourrait regarder du coté des expressions régulières perl

preg_match() et consorts
__________________
Pierre
1. Dans le manuel ( PHP, MySQL,..., rayez la mention inutile), tu te plongeras à deux fois plutôt qu'aucune.
2. Dans la doc php, tu liras attentivement les sections Chaines de caractères, Tableaux et Système de fichiers
3. Un code rapide c'est bien, un code maintenable c'est mieux
...

Why was the font tag an orphan ? Because it didn't have a font-family.
FCYPBA est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h41.


 
 
 
 
Partenaires

Hébergement Web