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 20/08/2011, 04h33   #1
Candidat au titre de Membre du Club
 
Inscription : août 2008
Messages : 30
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 30
Points : 12
Points : 12
Par défaut Ouvrir de gros fichiers en php ?

Bonsoir à tous,

J'ai un script php qui me permet de consulter les logs, cela marche pour les petits fichier (<2M) mais pas pour les gros.

Ma question : Quelle est la solution pour un ouvrir un gros fichier ( dépassant les 1 GB ) en php ? (bien évidemment avec traitement par ligne)

Merci d'avance.
BOTEN ANNA est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2011, 12h10   #2
Membre Expert
 
Avatar de gene69
 
Inscription : janvier 2006
Messages : 951
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : janvier 2006
Messages : 951
Points : 1 063
Points : 1 063
je dirai que t'es jamais obligé de charger tout ton fichier en memoire... au démarrage de ton appli. sans doute qu'une manipulation de tes données comme un flux 'résoudra' ton besoin.
__________________
PHP fait nativement la validation d'adresse électronique Vous êtes perdu en PHP? rassurez-vous ici (en)
Utilisez le bouton résolu!
gene69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2011, 15h42   #3
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 823
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations professionnelles :
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2005
Messages : 2 823
Points : 3 454
Points : 3 454
Citation:
J'ai un script php qui me permet de consulter les logs, cela marche pour les petits fichier (<2M) mais pas pour les gros.
Quel est le problème / message d'erreur ?

Citation:
Envoyé par BOTEN ANNA Voir le message
Ma question : Quelle est la solution pour un ouvrir un gros fichier ( dépassant les 1 GB ) en php ? (bien évidemment avec traitement par ligne)
Ne pas utiliser file_get_contents( )
fopen/fgets/fclose devraient suffire.
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2011, 16h43   #4
Candidat au titre de Membre du Club
 
Inscription : août 2008
Messages : 30
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 30
Points : 12
Points : 12
J'utilise actuellement la fonction array_reverse(file($file)); car je dois lire les logs de la fin au début et c'est trop trop gourmand en mémoire.

J'ai l'erreur :
Citation:
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 1975602547 bytes) in /var/site/track.php on line 100
Justement c'est ce que je cherche, c'est de lire un fichier à la volée sans le charger en mémoire et si possible à l'envers?
BOTEN ANNA est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2011, 17h36   #5
Modérateur
 
Inscription : septembre 2010
Messages : 7 104
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 104
Points : 8 452
Points : 8 452
oui avec fseek + fread, sinon tu lis avec fgets et tu prends que les lignes qui t’intéresses
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2011, 04h00   #6
Candidat au titre de Membre du Club
 
Inscription : août 2008
Messages : 30
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 30
Points : 12
Points : 12
J'ai essayé avec fread et toujours le même problème de mémoire...


Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 1975602547 bytes) in /var/site/track.php on line 100
BOTEN ANNA est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2011, 04h03   #7
Modérateur
 
Inscription : septembre 2010
Messages : 7 104
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 104
Points : 8 452
Points : 8 452
Citation:
Envoyé par BOTEN ANNA Voir le message
J'ai essayé avec fread et toujours le même problème de mémoire...


Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 1975602547 bytes) in /var/site/track.php on line 100
parce que tu met touts dans une variable, montre ce que t'as fait
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2011, 18h28   #8
Candidat au titre de Membre du Club
 
Inscription : août 2008
Messages : 30
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 30
Points : 12
Points : 12
Citation:
Envoyé par stealth35 Voir le message
parce que tu met touts dans une variable, montre ce que t'as fait
Apparemment ça marche avec ce code :

Code :
1
2
3
4
5
6
7
8
9
10
<?php 
    $file = "";
    $f = fopen($file, "r+");
    $i = 1;
    while ( $i <= 100  ) 
{
    echo  fgets($f);
   $i++;
}
?>

Mais je plante avec fseek pour lire le fichier à l'envers ?
BOTEN ANNA est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2011, 18h40   #9
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 823
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations professionnelles :
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2005
Messages : 2 823
Points : 3 454
Points : 3 454
Tu as des exemples d'utilisation dans la doc http://fr.php.net/fseek
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2011, 19h18   #10
Candidat au titre de Membre du Club
 
Inscription : août 2008
Messages : 30
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 30
Points : 12
Points : 12
Désolé mais je plante toujours (même avec la doc), pourriez-vous me donner un exemple avec mon code ?
BOTEN ANNA est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2011, 21h53   #11
Membre du Club
 
Avatar de Sylvain__A_
 
Homme Sylvain Artois
Développeur Java
Inscription : octobre 2008
Messages : 100
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Artois
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Java
Secteur : Communication - Médias

Informations forums :
Inscription : octobre 2008
Messages : 100
Points : 55
Points : 55
Envoyer un message via Skype™ à Sylvain__A_
Tu peux essayer avec la SPL, et plus particulièrement la classe SplFileObject,
qui te permet de boucler sur le contenu d'un fichier via foreach (interface Iterator & SeekableIterator), et bien plus, voir ce tuto:
http://gooh.posterous.com/iterating-files-with-spl

Citation:
And of course you can stack an SplFileObject into other Iterators, for instance the LimitIterator to limit how many lines should be iterated over:
Code :
1
2
3
4
5
6
7
8
9
 
$linesTenToTwentyIterator = new LimitIterator(
    new SplFileObject("file.txt"), 
    9, // start at line 10
    10 // iterate 10 lines
);
foreach ($linesTenToTwentyIterator as $line) {
    echo $line; // outputs line 10 to 20
}
Mais bon, un fichier de log de 2GO, c'est un peu trop... Si j'étais à ta place, j'essayerais de traiter le problème en amont. Log Rotate est ton ami...
Sylvain__A_ est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/08/2011, 03h15   #12
Candidat au titre de Membre du Club
 
Inscription : août 2008
Messages : 30
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 30
Points : 12
Points : 12
Vraiment les autres ont tendance de "nature" à vouloir compliquer les choses ? Vas savoir pourquoi...

Merci Sylvain__A_, tu m'as ouvert les yeux et j'ai finalement opté pour le shell_exec (tail $fichier).

Et par la même occasion je souhaiterai partager avec vous une autre méthode qui marche aussi :

> http://tekkie.flashbit.net/php/tail-...onality-in-php

A bon entendeur.
BOTEN ANNA est déconnecté   Envoyer un message privé Réponse avec citation 01
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h34.


 
 
 
 
Partenaires

Hébergement Web