Ecriture dans fichier
Résolu
Enax
-
Enax Messages postés 203 Date d'inscription Statut Membre Dernière intervention -
Enax Messages postés 203 Date d'inscription Statut Membre Dernière intervention -
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.
Merci.
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:
- Ecriture dans fichier
- Fichier bin - Guide
- Fichier epub - Guide
- Fichier rar - Guide
- Comment réduire la taille d'un fichier - Guide
- Fichier .dat - Guide
8 réponses
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"
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"
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.
> 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.
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:
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];
Bonjour,
C'est déjà le cas (cf mon code du 1er post) :
Ce passage est correct puisque le fichier contenant les timestamp est bien MAJ prouvant que le script rentre bien dans la condition.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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 !
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 !
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é) :
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 ?
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 ?
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:
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(); ?>
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.
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.