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 :

fwrite s'execute toujours 2 fois en fin de fichier [PHP 5.2]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Janvier 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2008
    Messages : 227
    Par défaut fwrite s'execute toujours 2 fois en fin de fichier
    Bonjour,


    Voilà, je rencontre un petit problème avec la fonction fwrite.

    En effet, celle ci s'exécute toujours 2 fois mais uniquement lorsque le fichier à été lu en entier précédemment (pointeur à la fin). Si je replace le pointeur à un endroit donné, alors, fwrite ne semble s'exécuter qu'une fois.

    Je n'ai pu trouver aucune info en rapport avec mon problème sur le web. Si vous avez une idée, merci d'avance.


    Patouche

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Peux-tu nous fournir un code test qui reproduise ton probleme ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre expérimenté
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Janvier 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2008
    Messages : 227
    Par défaut
    Pour le code, oui, pas de problème. Mais c'est de l'objet.

    La classe ReadWrite
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    <?php
     
    class Core_File_ReadWrite extends Core_File_Read implements Core_Stream_IO {
     
     
    	/**
    	 * Class constructor.
    	 * 
    	 * @access		public
    	 * @param		string		$fileName
    	 * @param		string		$mode
    	 * @param		string		$context
    	 */
    	public function __construct ($fileName, $mode = self::MODE_READ_WRITE, $context = null) {
    		parent::__construct($fileName, $mode, $context);
    	}
     
    	/**
    	 * Ecrit n caractères dans le flux
    	 * 
    	 * @access		public
    	 * @param		string		$string
    	 * @param		int			$length
    	 * @return		mixed
     	 */
    	public function write ($string, $length = null) {
    		$length = ($length !== null) ? $length : strlen($string);
    		return fwrite($this->getStream(), $string, $length);
    	}
     
    	/**
    	 * Ecrit une ligne dans le flux
    	 * 
    	 * @access		public
    	 * @param		string		$line
    	 * @return		mixed
    	 */
    	public function writeLine ($line) {
    		if ( false === ($n = strpos($line, "\n")) )
                return $this->write($line . "\n");
     
            return $this->write( substr($line, 0, $n) . "\n" );
    	}
     
    	/**
    	 * Vide le flux et réécrit par dessus les données précédantes
    	 * 
    	 * @access		public
    	 * @param		string		$string
    	 * @return		mixed
    	 */
    	public function writeAll ($string) {
    		$this->seek(0, self::SEEK_SET);
    		return $this->write($string, strlen($string));
    	}
     
    	/**
    	 * Tronque un le flux
    	 * 
    	 * @access		public
    	 * @param		string		$size
    	 * @return		bool
    	 */
    	public function truncate($size) {
    		return ftruncate($this->getStream(), $size);
    	}

    La classe Read :
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
     
    class Core_File_Read extends Core_File_File implements Core_Stream_IO_Input {
     
    	/**
    	 * Class constructor.
    	 * 
    	 * @access		public
    	 * @param		string		$fileName
    	 * @param		string		$mode
    	 * @param		string		$context
    	 */
    	public function __construct ($fileName, $mode = self::MODE_READ, $context = null) {
    		parent::__construct($fileName, $mode, $context);
    	}
     
    	/**
    	 * Test pour fin de fichier
    	 * 
    	 * @return	boolean
    	 */
    	public function eof () {
    		return feof($this->getStream());
    	}
     
    	/**
    	 * Lit n caractères
    	 * 
    	 * @access		public
    	 * @param		int			$length
    	 * @return		string
    	 */
    	public function read ($length) {
    		if($length <= 0)
    			throw new Core_File_Exception('Length must be greather than 0, given %d.', $length);
     
    		return fread($this->getStream(), $length);
    	}
     
    	/**
    	 * Lit une ligne
    	 * 
    	 * @access		public
    	 * @return		string
    	 */
    	public function readLine() {
    		return fgets($this->getStream());
    	}
     
    	/**
    	 * Lit le flux en entier tant que cela est possible
    	 * 
    	 * @access		public
    	 * @return		string	
    	 */
    	public function readAll($offset = 0) {
     
    		$offset = ( $offset < 0 ) ? 0 : $offset ;
     
    		if( $this->isStreamResourceMustBeUsed() ) {
     
    			$this->seek(0, self::SEEK_END);
    			$end     = $this->tell();
     
    			if ( $offset >= $end )
    				return false;
     
    			$this->seek($offset, self::SEEK_SET);
     
    			return $this->read($end - $offset);
    		}
     
    		$third = $this->getStreamContext();
    		$third = ($third === null) ? null : $third->getContext();
     
    		return file_get_contents(
    			$this->getStreamName(),
    			false,
    			$third,
    			$offset
    		);
    	}
     
     
    }

    Et pour finir la classe de test :
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    <?php
     
    class Test_File_Case01 extends Core_Test_Case {
     
    	public function run() {
     
    		$fileName = realpath(dirname(dirname(__FILE__))) . DS . 'test-link.txt';
     
    		Core_Debug::Dump($fileName);
     
    		$file = new Core_File_ReadWrite($fileName);
     
    		$file->alwaysUseStreamResource(true);
     
    		$a = ( true === $file->isOpened() );
    		$this->assert('isOpened : Vérification d\'ouverture du fichier', $a);
     
    		$this->dump('getPermissions : h', $file->getPermissions());
     
     
    		$this->dump('read 10 : lecture des 10 premiers caractères', $file->read(10));
     
    		$a = ( $file->tell() === 10 );
    		$this->assert('tell : position courante du pointeur : 10', $a );
     
    		$a = ( $file->seek(0) === true );
    		$this->assert('seek 0 : Envoie la pointeur à la position 0', $a );
     
    		$a = ( $file->tell() === 0 );
    		$this->assert('tell : vérification de la position du pointeur à 0', $a );
     
    		$this->dump('readLine : lecture de la première ligne', $file->readLine() );
     
    		$this->dump('readAll : lecture de tout le fichier', $r = $file->readAll() );
     
    		$this->assert('Fin de fichier : eof', ($file->eof() === true) );
     
    		$file->seek( -1 ,Core_File_File::SEEK_END);
    		$file->writeLine("Ajout d'une dernière ligne");
    		$this->dump('writeLine : "Ajout d\'une dernière ligne"', $file->readAll() );
     
    	}
     
    }

    Voilà pour l'essentiel.

    Dans la méthode Test::run, 3 lignes avant la fin, (le seek) si l'on en change la valeur, la duplication ne se fait pas.

    Ex : si l'on ecrit $file->seek(1000 ,Core_File_File::SEEK_SET); alors on a pas de duplication.

    Mais si l'on se trouve à la fin (ou sur la dernière ligne), alors le contenu "Ajout d'une dernière ligne" est dupliqué.

    La classe de Test n'est pas à remettre en cause (j'ai essayé le même test mais de manière procédurale et rien n'y change)


    Merci d'avance.

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Tu pourrais fournir un code tout prêt ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre expérimenté
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Janvier 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2008
    Messages : 227
    Par défaut
    Dur dur.... de faire ça. C'est dans un framework en cours de construction.

    Pour simplifier (enfin je l'espère), vous pouvez accédez (temporairement) au source sur mon pc. Je vous ai aussi créer une archive.

    Mais vous pourrez trouver le résultat & les sources ici :

    supprimer

    En espérant que cela puisse vous aidez à comprendre mon problème.


    Problème résolu :

    Le problème a disparu en changeant de navigateur.

    Il s'agissait d'un problème généré par opéra. Il semblerait qu'il fasse un double appel à des pages en local ce qui entrainait une duplication des données.

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Ce genre de problème apparaissait dans d'anciennes versions de firefox quand il y avait des reférences CSS incorrectes comme link="" ou url=""
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

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

Discussions similaires

  1. Ecouteur JList qui s'execute n^n fois !
    Par gabule dans le forum Composants
    Réponses: 4
    Dernier message: 19/05/2006, 10h13
  2. Réponses: 2
    Dernier message: 16/09/2005, 18h03
  3. [Test][Perf]Mesure du temps d'execution différente 2 fois de suite
    Par debdev dans le forum Tests et Performance
    Réponses: 11
    Dernier message: 22/07/2005, 12h04
  4. Réponses: 1
    Dernier message: 19/03/2005, 22h47
  5. ShellExecuteEx ne s'execute pas à chaque fois??
    Par Gothico dans le forum MFC
    Réponses: 11
    Dernier message: 01/03/2005, 22h02

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