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
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
A voir également:
- Ecriture dans fichier
- Fichier rar - Guide
- Fichier host - Guide
- Comment ouvrir un fichier epub ? - Guide
- Écriture facebook - Guide
- Comment réduire la taille d'un fichier - Guide
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
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"
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"
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
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.
> 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.
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
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:
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];
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
12 févr. 2008 à 11:17
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
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
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 !
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 !
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
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é) :
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 ?
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
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:
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(); ?>
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
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.
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.