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 11/06/2007, 21h09   #1
Futur Membre du Club
 
Inscription : février 2006
Messages : 50
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 50
Points : 17
Points : 17
Par défaut [CSV] Lecture de fichier "volumineux"

Bonjour,

J'ai un site qui fonctionait et depuis hier il y a une erreure. Quand je le roule sur mon serveur local, ça marche mais quand je le remet sur le serveur de deployement le bug réapparait. J'ai trouvé la ou ça bloque. J'ai un fichier csv qui contient près de 7500 lignes. mon script l'ouvre et le lit au complet, mais depuis hier il arrive plus a le lire au complet. Il s'arrête à la ligne 54463. Du coup le reste du script ne s'exécute plus. Je n'arrive pas à savoir pourquoi. Est-ce que ça vient de mon hebergeur? Où est-ce une attaque de type overflow. Je ne m'y connais pas trop en ce type d'attaque. À l'aide svp.

voilà le bout de code qui lit:
Code :
1
2
3
4
5
6
7
8
 
$row = 1;
while (($buffer = fgets($handle, 4096)) !== FALSE) 
{
 
    $array[$row] = substr($buffer, 1, strpos($buffer, ",") - 2);
    $row++;
}
Merci d'avance
damaskinos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/06/2007, 21h27   #2
Membre émérite
 
Avatar de julien.63
 
Inscription : décembre 2005
Messages : 1 322
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 1 322
Points : 981
Points : 981
Envoyer un message via MSN à julien.63
salut,
ça vient surement d'une différence dans le php.ini
Si tu n'as pas les droits pour le modifier comme tu le souhaites, tu peux essayer à la volée avec ini_set http://www.php.net/manual/fr/function.ini-set.php
julien.63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/06/2007, 21h29   #3
Futur Membre du Club
 
Inscription : février 2006
Messages : 50
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 50
Points : 17
Points : 17
Oui mais je dois changer quoi au juste?
damaskinos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/06/2007, 23h40   #4
Membre émérite
 
Avatar de viviboss
 
Inscription : août 2006
Messages : 943
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Gard (Languedoc Roussillon)

Informations forums :
Inscription : août 2006
Messages : 943
Points : 941
Points : 941
C'est sur, c'est du coté du php.ini qu'il faut voir : fait un fichier info.php avec une seule instruction : phpinfo();

Pour changer une valeur du php.ini, il suffit de placer cette ligne avant celles que tu nous montre :

Code :
1
2
 
ini_set(valeur_du_php.ini, nouvelle_valeur);
le phpinfo te donnera exactement toute les valeurs du php.ini. Il faut que tu cherches les lignes du type : post_size, etc...., Bref, des attributs avec comme valeur des Mo....

Tu as cette valeur qui dérange quelques fois : upload_max_filesize, surtout si tu l'Upload....

Il faudrait que tu compare le phpinfo de ton serveur chez toi, et celui de ton hébergeur pour relever les différences....
__________________
Veni Vidi Vici
-------------------------
Mes articles : developpez.com ou bien vbview.net
-------------------------
Et SURTOUT ne pas oublier la bible PHP : --> php_manual_fr.chm!!!
Et aussi : --> pear_manual_fr.chm!!!

Ou encore : --> Les tutoriaux & cours PHP de Développez.com
-------------------------
viviboss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/06/2007, 00h00   #5
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 damaskinos
J'ai un fichier csv qui contient près de 7500 lignes.
Il s'arrête à la ligne 54463.
Il y en a combien du coup ?

Ne serait-ce pas plutôt un problème liée au fait que vous ayez atteint la quantité de mémoire maximale ou le temps d'exécution maximal ? Pourriez-vous placer ceci en haut de votre script et nous donner les erreurs affichées ?
Code :
1
2
error_reporting(E_ALL);
ini_set('display_errors', 1);
(en espérant qu'ini_set vous soit accessible)
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/06/2007, 06h12   #6
Futur Membre du Club
 
Inscription : février 2006
Messages : 50
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 50
Points : 17
Points : 17
J'ai cette erreur qui s'affiche

Citation:
Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 4097 bytes) in /home/site/www/site/iptest.php on line 35
.

C'est clair que c est un problème de mémoire. Donc je devrais changer l'attribut
memory_limit et la augmenter. Mais maintenant, pourquoi ce script fonctonnait et la j,ai ce problème ? Je ne crois pas que quelqu,un a changé le php.ini. On a un seveur virtuel. Bon j'essaye ça et je reviens vous donner des nouvelles.
damaskinos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/06/2007, 06h14   #7
Futur Membre du Club
 
Inscription : février 2006
Messages : 50
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 50
Points : 17
Points : 17
J'ai changé la valeur de memory_limit et la ca fonctionne. Je n'arrive pas à comprendre pourquoi ça fontionnait avant et que d'un coup ça marchait plus.

Merci à tous pour vos reponse
damaskinos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/06/2007, 08h09   #8
Membre chevronné
 
Avatar de stunti
 
Inscription : mai 2006
Messages : 521
Détails du profil
Informations personnelles :
Âge : 33

Informations forums :
Inscription : mai 2006
Messages : 521
Points : 602
Points : 602
Cela marche jsuqu'a ce que cela ne marche plus de nouveau.
Le probleme avec ta methode de traitement du fichier, c'est que tu charge tout le fichier en memoire.
Donc quand la taille de ton fichier augmente la taille de ta variable en memoire augmente.
Le meilleur moyen de traiter un fichier dont tu ne connais pas la taille (et qui a donc une taille potentiellement infini) c'est de faire un traitement ligne a ligne ou par block de plusieurs lignes.
Tu evite ainsi une saturationde ta memoire.
__________________
If it's not broken, don't fix it.
BiliBa Built on top of Zend Framework
stunti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/06/2007, 11h22   #9
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
fgets = lecture par ligne ...

ça vient vraisemblablement du tableau puisque vous y ajoutez au fur et à mesure de votre lecture des parties de chaque ligne. Pourquoi ça ne fonctionne plus aujourd'hui ? Vous avez du ajouté une paire de lignes à ce fichier ce qui fait que maintenant la mémoire nécessaire pour le script n'est plus suffisante et ses besoins dépassent cette limite de 8Mo alors que 4Ko supplémentaires seraient, ici, requis.
julp 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 14h37.


 
 
 
 
Partenaires

Hébergement Web