Ecriture dans fichier

Résolu/Fermé
Enax - 11 févr. 2008 à 11:49
Enax Messages postés 203 Date d'inscription lundi 11 février 2008 Statut Membre Dernière intervention 16 mars 2010 - 15 févr. 2008 à 13:11
Bonjour,

J'ai un problème avec un bout de code :

J'ai 3 fichiers mis à jour tous les jours :
- Le premier contient une liste de timestamp. Chaque timestamp correspond à la date de mise à jour des fichiers.
- Les deux autres fichiers enregistrent des infos tirées d'une table.

Pour éviter que le script ne soit pas exécuté à cause d'un problème chez mon hébergeur, il est lancé plusieurs fois par jour, mais la mise à jour des fichiers ne s'effectue que si le jour actuel est différent du dernier timestamp enregistré dans le premier fichier.

Le problème :
Le premier jour, les fichiers sont vides, et lors de la MAJ, tout se passe nickel.
Mais le deuxième jour (et les suivants), seul le fichier qui contient les timestamp est MAJ et je ne m'explique pas pourquoi.


$timestamp = file('fichier_date.txt', FILE_IGNORE_NEW_LINES);
$timestamp = array_reverse($timestamp);
 
if(date('jmy', $timestamp[0]) != date('jmy'))
{
        $reponse = mysql_query('SELECT * FROM table WHERE id > 1');
        while($retour = mysql_fetch_array($reponse))
        {
                $fichier = fopen('fichier_1_'.$retour['id'].'.txt', 'ab');
                $variable = $retour['truc1'] + ... + $retour['truc10'];
                fwrite($fichier, $variable."\n");
                fclose($fichier);
                        
                $fichier = fopen('fichier_2_'.$retour['id'].'.txt', 'ab');
                $variable = $retour['truc11'] + ... + $retour['truc20'];
                fwrite($fichier, $variable."\n");
                fclose($fichier);
        }
        
        $timestamp = time();
        $fichier = fopen('fichier_date.txt', 'ab');
        fwrite($fichier, $timestamp."\n");
        fclose($fichier);
}


Merci.
A voir également:

8 réponses

Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
11 févr. 2008 à 19:01
Bonsoir,

Je ne vois pas à quoi sert le 2ième parametre:
$timestamp = file('fichier_date.txt', FILE_IGNORE_NEW_LINES);

file te renvoie un array, alors prend le dernier élément

ensuite qd tu fais fopen pourqoui avec le parametre 'ab' 'a' suffit il ouvre en écriture et place le pointeur en fin de fichier

il faudrait que tu empile ton nouveau timestamp à la fin de l'array retourné par file, et que tu l'écrives par une boucle dans ton fichier ouvert avec "w"
0
Enax Messages postés 203 Date d'inscription lundi 11 février 2008 Statut Membre Dernière intervention 16 mars 2010 145
11 févr. 2008 à 21:30
Merci de te pencher sur mon problème.

> Je ne vois pas à quoi sert le 2ième parametre:
> $timestamp = file('fichier_date.txt', FILE_IGNORE_NEW_LINES);

C'est pour se débarrasser des fins de ligne. J'avais un jour eu des problèmes sur un script à cause de ça (il lisait une ligne comme une chaîne plutôt qu'un nombre si je me souviens bien).

> file te renvoie un array, alors prend le dernier élément

C'est ce que je fais avec array_reverse, même si ce n'est pas forcément la meilleure technique. Existe-t-il un moyen plus simple ?

> ensuite qd tu fais fopen pourqoui avec le parametre 'ab' 'a' suffit il ouvre en écriture et place le pointeur en fin de fichier

Le 'b' permet d'écrire en mode binaire. Il est conseillé de toujours le préciser dans le manuel PHP : https://www.php.net/manual/fr/function.fopen.php
Faudra que je teste sans pour voir.

> il faudrait que tu empile ton nouveau timestamp à la fin de l'array retourné par file, et que
> tu l'écrives par une boucle dans ton fichier ouvert avec "w"

En fait, le timestamp est toujours bien écrit en fin de fichier et ne me pose pas de problème. C'est l'écriture des $variable dans fichier_1_xxx.txt et fichier_2_xxx.txt qui coince.

Un truc qui m'épate, c'est que si je récupère fichier_date.txt, que je supprime la dernière entrée (correspondant à la MAJ qui n'a pas fonctionné pour les fichiers 1 et 2), que je renvoie le fichier sur le site et que je lance manuellement le script, la MAJ fonctionne alors comme voulue.
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
12 févr. 2008 à 09:01
Bonjour,

Si cela supprime la dernière ligne vide ok,
par contre array_reverse($timestamp); inverse l'array et pour récupérer la dernière valeur rentrée, il faut que tu lise le premier élément de l'array:

$array_timestamp = file('fichier_date.txt', FILE_IGNORE_NEW_LINES);
$array_timestamp = array_reverse($array_timestamp);
$timestamp=$array_timestamp[0];
0
Enax Messages postés 203 Date d'inscription lundi 11 février 2008 Statut Membre Dernière intervention 16 mars 2010 145
12 févr. 2008 à 11:17
Bonjour,

C'est déjà le cas (cf mon code du 1er post) :
$timestamp = file('fichier_date.txt', FILE_IGNORE_NEW_LINES);
$timestamp = array_reverse($timestamp);
 
if(date('jmy', $timestamp[0]) != date('jmy'))


Ce passage est correct puisque le fichier contenant les timestamp est bien MAJ prouvant que le script rentre bien dans la condition.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
12 févr. 2008 à 13:39
Bonjour,

Excuses, j'avais pas fait gaffe !

Alors c'est peut être un pb au moment de l'écriture, essayes d'enlever le \n de fwite(... du timestamp dans ton fichier date


???

Mais je dis peut être une annerie !
0
Enax Messages postés 203 Date d'inscription lundi 11 février 2008 Statut Membre Dernière intervention 16 mars 2010 145
14 févr. 2008 à 13:36
Bonjour,

En fait le problème viendrait éventuellement de mon hébergeur.

Afin d'isoler le problème, j'ai refait mon script. Ma page contient exactement ça (j'ai juste renommé les fichiers et les variables pour plus de lisibilité) :
<?php
    include('fonctions.php');
    ConnectionMysql();
    
    $reponse = mysql_query('SELECT * FROM table WHERE id > 1');
    while($donnees = mysql_fetch_array($reponse))
    {
        $fichier = fopen('fichier_1_'.$donnees['id'].'.txt', 'ab');
        $variable = $donnees['1'] + $donnees['2'];
        fwrite($fichier, $variable."\n");
        fclose($fichier);
        
        $fichier = fopen('fichier_2_'.$donnees['id'].'.txt', 'ab');
        $variable = $donnees['10'] + $donnees['20'];
        fwrite($fichier, $variable."\n");
        fclose($fichier);
    }
    
    $fichier = fopen('date_maj.txt', 'ab');
    fwrite($fichier, time()."\n");
    fclose($fichier);
    
    mysql_close();
?>

Quand j'exécute le script manuellement, tout fonctionne sans problème. Mais quand c'est le CRON de mon hébergeur qui le lance, seul le fichier date_maj.txt est bel et bien écrit.

Je ne m'y connais pas en CRON, ayant juste une interface chez mon hébergeur où j'indique l'adresse du script et la date d'exécution. Normalement, le CRON se contente d'accéder à la page du script ? Cela ne devrait pas avoir d'influence sur son exécution, non ?
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
14 févr. 2008 à 18:20
Bonsoir,

Je ne vois pas.

As tu accès aux journaux log chez ton hébergeur pour voir ce qui se passe ?

Sinon, essayes ça pour tracer un peu:

<?php
    include('fonctions.php');
    ConnectionMysql();
    
    $reponse = mysql_query('SELECT * FROM table WHERE id > 1');
	
	//init varaibles
	$ecrit_f1="";
	$ecrit_f2="";
    while($donnees = mysql_fetch_array($reponse))
    {
	    $variable = $donnees['1'] + $donnees['2'];
        if($fichier = fopen('fichier_1_'.$donnees['id'].'.txt', 'ab')){
			if(fwrite($fichier, $variable."\n")){
				$ecrit_f1=date('d-m-y H:i:s')." ouverture fichier1 ok ecriture ok";
			}
			fclose($fichier);
        }else{
			$ecrit_f1=date('d-m-y H:i:s')." ouverture fichier1 impossible";
		}
		
		$variable = $donnees['10'] + $donnees['20'];
        if($fichier = fopen('fichier_2_'.$donnees['id'].'.txt', 'ab')){
			if(fwrite($fichier, $variable."\n")){
				$ecrit_f2=date('d-m-y H:i:s')." ouverture fichier2 ok ecriture ok";
			}
			fclose($fichier);
		}else{
			$ecrit_f2=date('d-m-y H:i:s')." ouverture fichier2 impossible";
		}
    }
    
	$fichier = fopen('date_maj.txt', 'ab');
    fwrite($fichier, time()."\n");
    fclose($fichier);
	// on va ecrire dans le fichier trace
    $fichier = fopen('trace.txt', 'ab');
    fwrite($fichier, $ecrit_f1."    ".$ecrit_f2."\n");
    fclose($fichier);
    
    mysql_close();
?>
0
Enax Messages postés 203 Date d'inscription lundi 11 février 2008 Statut Membre Dernière intervention 16 mars 2010 145
15 févr. 2008 à 13:11
Problème résolu.

En lançant le script avec Webcron ( https://www.webcron.org/ ) plutôt qu'avec le planificateur de mon hébergeur, ça marche nickel. Mince, moi qui n'a pas arrêté de lire et relire mon code sans comprendre d'où pouvait venir une telle erreur... ^_^

Merci de ton attention Alain_42.
0