Bonjour, j’utilise depuis longtemps un fichier txt (compteur).
celui ci contient 27599 je veux le changer par 28500, pour ca pas de proble je l’ouvre avec nano je modifi et il contient bien 28500, puis ensuite il ne s’incremente plus, je récupére donc une copie avec 27599 qui s’incrémente toujours comme il faut (+1) a chaque fois.
je fais un chmo 777 mais rien n’y change, c’est fou ca meme sur mon serveur distant j’ai le meme problem.
Je n’ai pas bien compris ce que tu dis. Admettons que ça soit ceci:
- Tu as un script PHP qui incrémente un compteur dans un fichier texte
- Tu veux incrémenter ce fichier à la main, ça marche mais c’est le backup qui est incrémenté par le programme.
La raison est que ton script PHP ne ferme pas ton fichier à chaque incrémentation et le laisse ouvert, il manipule toujours le même inode. Lorsque tu édites un fichier, le backup est le fichier d’origine donc l’inode d’origine et le un nouvel inode est crée pour le fichier nouvellement édité. Un lsof devrait te permettre de vérifier cela en montrant un fichier constamment ouvert.
Il te faut simplement fermer correctement ton fichier dans le script PHP.
C’est quoi: une inode
C’est quoi: Un lsof
je parle php et compteur.txt
il ne s’incrémente plus avec le script aprés l’avoir modifié a la mano avec nano , gedit ou meme vi.
Boule de cristal, boule de cristal …
Peux-tu nous montrer le code, un ls -l compteur.txt, et aussi les éventuelles erreurs ?
Tu as essayé ton code en mettant un error_reporting(E_ALL); au début ?
justclo@bureau:
ls -l ./compteur.txt
-rwxrwxrwx 1 justclo justclo 5 3 janv. 12:13 ./compteur.txt
[code]
///generation du numero commande///////
$fp = fopen("./compteur.txt",“r+”);
$num_com = fgets($fp,11);
$num_com++;
fseek($fp,0);
fputs($fp,$num_com);
fclose($fp);
$num_com=$num_com+1;
$_SESSION[‘num_com’]=$num_com;
/////////////[/code]
Tu as essayé ton code en mettant un error_reporting(E_ALL); au début ?
-Non, je ne me rapelle plus comment on met ca dans l’entete de la pâge, je vais regarder de suite, parce-ce que sinon pas de message d’erreur.
je vient de modifier le fichier a la mano le resultat :
ls -l ./compteur.txt
-rwxrwxrwx 1 justclo justclo 6 3 janv. 20:13 ./compteur.txt
Je vient d’ éditer et modifier le fichier avec abiword et la il s’'incremente, meme apres la modification.
J’ai le même problème étonnant.
Je suis en train de faire un script compteur (avec fichier sans base de données), mais avec cookie, histoire de ne pas incrémenter le même utilisateur.
Bref, pendant mes tests, j’ai modifié un fichier avec vim et du coup il ne s’incrémente plus (de même avec un autre éditeur, ou traitement de texte).
j’ai vérifié avec lsof, le fichier n’y est pas, et il est bien fermé.
Étrange.
Édit :
Qqs pistes >
Sur l’irc debianfr, le membre Surcouf a appuyé mon intuition sur le saut de ligne que rajoute automatiquement l’éditeur vim et autres je suppose.
Confirmation avec la commande od -cx fichier.txt
Le rajout proposé par les liens suivants sur le fichier de config .vimrc ou directement dans l’éditeur via la commande :set fileformats=dos
etc… n’ont rien donné. Mais y’a de bonnes pistes.
fr.w3support.net/index.php?db=so&id=1050640
vim.dindinx.net/vim7/traduit/htm … t.php#23.1 (très bon ce lien )
Je ne connais pas PHP et je n’ai pas le temps d’aller voir les nom de fonctions exacte, mais l’algorithme devrait être, je pense :
ouvrir_le_fichier_en_lecture/écriture
lire_un_entier
se_positionner_au_début_du_fichier
tronquer_le_fichier
écrire_lentier
fermer_le_fichier
avec éventuellement un flush avant la modification. Si c’est déjà ce que tu fais montre-nous le code.
Au passage j’ai aucune idée de comment ça se passe avec plusieurs client simultanément [size=50](c’est vraiment bien les bases de données)[/size].
C’est une vielle fonction que j’avais fais en 2005 (PHP4), mais je pense que j’avais bien respecté le protocole comme tu le soulignes :
function Compteur($fichierCompteur,$chemin)
{
if(file_exists($chemin.$fichierCompteur))
{
$ouvre=fopen($chemin.$fichierCompteur,"r+");
$compteur = fgets($ouvre,7);
$compteur++;
rewind($ouvre);
fwrite($ouvre,$compteur,7);
fclose($ouvre);
}
else
{
$ouvre=fopen($chemin.$fichierCompteur,"w");
$compteur=1;
fwrite($ouvre,$compteur,7);
fclose($ouvre);
}
return $compteur;
}
[size=85]Édit : oui c’est vraiment bien les bases de données, mais à l’époque j’étais en mutualisé (à la base je le faisais via une base de données avec données statistiques à la clé) et même en dédié, j’ai pris pour habitude d’alléger le plus possible cette dernière… Pour mon site en question (site d’annonces) j’ai déjà environs 100 tables et le tout mis en cache à chaque page qui en fait appel (fichiers > ob_start()…), avec 5 000 visites uniques par jours je me dois d’optimiser cette dernière [/size]
édit 2 : j’ai bien tenté d’ouvrir le fichier avec la fonction trim() censée éliminer les espaces, tab,\n,\0 ect… de début et de fin de ligne, mais nada.
Euh ça n’a peut-être rien à voir mais pourquoi s’emmerder à passer avec un fopen quand on peux utiliser un file_get_contents file_put_contents ?
Vous êtes contraint d’utiliser du PHP4 ?
Merci de ta remarque constructive, rassures toi, c’est ce que j’utilise depuis fin 2006, mais à l’époque ou j’ai fait l’autre script, PHP 5 ce faisait rare
Mes potes eux me demandent pourquoi je suis contraint avec PHP tout court alors qu’il y’a Ruby on Rails…
Mais mince à la fin, laissez moi être has-been
Sinon, pour en revenir au sujet, toujours pas trouvé, mais ça va se faire, je le sens