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 :

triple insertion dans un fichier.


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Doksuri
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    2 517
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 517
    Par défaut triple insertion dans un fichier.
    Bonjour,

    je me fais une petite fonction pour loger les erreurs (ou des variables), mais lors de l'ecriture dans le fichier... il m'insert 3 fois le meme enregistrement. o_0

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    public static function log($variable = "", $comment ="")
    	{
    		$i = 1;
    		$file_name = date("Ymd_H")."h.txt";
    		$heure = date("H:i:s");
    		if(is_array($variable)) {
    			$infos = print_r($variable,true);
    		} else {
    			$infos = $variable;
    		}
    		$fd = fopen("logs/".$file_name, "a");
    		fwrite($fd, $_SERVER['REMOTE_ADDR']." | ".$heure." | ".$_SERVER['REQUEST_URI']." | ". $comment ." <".$i.">\n");
    		fwrite($fd, $_SERVER['REMOTE_ADDR']." | ".$heure." | ".$_SERVER['REQUEST_URI']." | ". $infos ."\n\n");
    		$i++;
    		fclose($fd);
    	}
    note : j'ai ajoute $i juste pour verifier... et il reste bien a 1 (donc il ne repasse pas plusieurs fois...)

    pour tester, j'ai ca : Debug::log($membre, "test log comment");dans mon fichier de log :
    127.0.0.1 | 18:55:07 | /test_log.html | test log comment <1>
    127.0.0.1 | 18:55:07 | /test_log.html | toto

    127.0.0.1 | 18:55:07 | /test_log.html | test log comment <1>
    127.0.0.1 | 18:55:07 | /test_log.html | toto

    127.0.0.1 | 18:55:07 | /test_log.html | test log comment <1>
    127.0.0.1 | 18:55:07 | /test_log.html | toto
    pourquoi 3fois ?
    a la limite.. 2fois, on aurait pu dire que ca vennait de mes 2 fwrite... mais 3...je ne vois pas
    La forme des pyramides prouve que l'Homme a toujours tendance a en faire de moins en moins.

    Venez discuter sur le Chat de Développez !

  2. #2
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Salut

    Si ce n'est pas dans la méthode Debug::log() qui cause problème, c'est peut être en-dehors, quelle serait appelée 3 fois.

    As tu exploré la fonction debug_backtrace() pour en savoir un peu plus sur ce qu'il se passe ?
    Ce sera peut être plus "parlant" ?


    Au passage, pourquoi ne pas utiliser la fonction file_put_contents() ou error_log() pour faire cela (au lieu de 3 fonctions) ?

  3. #3
    Membre Expert
    Avatar de Doksuri
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    2 517
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 517
    Par défaut
    Salut,
    merci pour tes lumieres.

    c'est peut être en-dehors, quelle serait appelée 3 fois.
    => non, il n'y a que la ou j'y fait appel (et c'est meme pas dans une boucle)

    debug_backtrace()
    => je ne conaissais pas, mais ca ne m'en a pas appris plus...

    pourquoi ne pas utiliser la fonction file_put_contents()
    => parceque file_get_contents() genere une erreur si le fichier n'existe pas
    => et que l'option "a" de fopen() permet de placer le curseur a la fin de fichier... si le fichier de log fait 10 000 lignes... ca va etre lourd de le recuperer pour le re-ecrire + 1 ligne

    error_log()
    => je ne veux pas stocker les erreurs dans apache (ni dans php) mais dans des fichier rapidement accessibles pour le suivit des problemes plus tard (pas forcement par moi)

    :/
    La forme des pyramides prouve que l'Homme a toujours tendance a en faire de moins en moins.

    Venez discuter sur le Chat de Développez !

  4. #4
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    J'ai rien contre de faire successivement fopen/fwrite/fclose, cependant quelques précisions pourraient être utiles.

    => parceque file_get_contents() genere une erreur si le fichier n'existe pas
    => et que l'option "a" de fopen() permet de placer le curseur a la fin de fichier... si le fichier de log fait 10 000 lignes... ca va etre lourd de le recuperer pour le re-ecrire + 1 ligne
    Dans la doc de Php il est dit ceci concernant : file_put_contents()
    Revient à appeler les fonctions fopen(), fwrite() et fclose() successivement.
    Aussi, cette fonction accepte un flag en 3ème paramètre qui permet d'obtenir le même comportement.
    FILE_APPEND : Si le fichier filename existe déjà, cette option permet d'ajouter les données au fichier au lieu de l'écraser.


    Concernant la fonction error_log(), elle accepte en 3ème paramètre un flag (de 0 à 4) permettant de d'indiquer qu'il faudra tenir compte de la destination indiquée en 4ème paramètre.
    Donc certes par défaut l'écriture aura lieu dans le fichier de log de Php, mais on peu aussi le faire là où on le souhaite de manière ponctuelle, comme ici pour un fichier journal.
    Si le fichier n'existe pas, il est créé.
    Suffit de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error_log("Un message", 3, "un/autre/fichier/journal.txt");

    Mais encore, il est dit ceci pour la fonction fopen() :
    Erreurs / Exceptions
    Si l'ouverture échoue, une alerte E_WARNING sera générée.

    Un fopen peu poser problème aussi.


    Pour ma part les 3 solutions sont valables, de même que dans tous les cas il serait bon de mettre un try/catch (ou un @ pas très zen) pour gérer en cas d'erreur.



    Mise à part tout ça, j'ai essayé le code, et je n'ai pas remarqué de triple écriture.
    Ton problème viendrait ailleurs que dans cette méthode log().

    As tu essayé de supprimer (ou commenter) petit à petit du code pour tenter de voir lequel provoquerait ce phénomène là ?
    Ou l'inverse, de partir sur quelque chose de fonctionnel (1 seule écriture) et réintégrer petit à petit les codes.

    Il y a surement un élément extérieur perturbateur, mais je ne vois pas lequel malheureusement.

Discussions similaires

  1. [DBF] Comment faire une insertion dans le fichier ?
    Par dor_boucle dans le forum Autres SGBD
    Réponses: 1
    Dernier message: 14/12/2005, 07h46
  2. Comment faire une insertion dans un fichier texte ?
    Par Isa31 dans le forum Langage
    Réponses: 10
    Dernier message: 28/12/2004, 09h06
  3. Réponses: 2
    Dernier message: 01/06/2004, 12h47
  4. Insertion dans un fichier xml à partir d'un xsl
    Par alexandre54 dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 21/03/2003, 09h45
  5. Insertion dans un fichier XML
    Par [DreaMs] dans le forum XMLRAD
    Réponses: 4
    Dernier message: 27/02/2003, 17h16

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