IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[CSV] Lecture de fichier "volumineux"


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 54
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre éprouvé Avatar de julien.63
    Profil pro
    balayeur
    Inscrit en
    Décembre 2005
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : balayeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 348
    Par défaut
    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

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 54
    Par défaut
    Oui mais je dois changer quoi au juste?

  4. #4
    Membre émérite
    Avatar de viviboss
    Profil pro
    Inscrit en
    Août 2006
    Messages
    943
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Août 2006
    Messages : 943
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    -------------------------

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
    (en espérant qu'ini_set vous soit accessible)

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 54
    Par défaut
    J'ai cette erreur qui s'affiche

    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.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 54
    Par défaut
    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

  8. #8
    Membre émérite Avatar de stunti
    Inscrit en
    Mai 2006
    Messages
    520
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mai 2006
    Messages : 520
    Par défaut
    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.

  9. #9
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lecture de fichiers .txt volumineux
    Par BlackAlpha dans le forum C#
    Réponses: 24
    Dernier message: 16/01/2020, 13h21
  2. [CSV] Lecture de fichier CSV
    Par fthem dans le forum Langage
    Réponses: 18
    Dernier message: 23/09/2008, 08h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo