Voor een eenvoudige teller op één van mijn sites, gebruik ik een zelfgeschreven teller-script.
Het werkt extreem simpel;
Ik denk zelf dat het komt doordat twee bezoekers op exact hetzelfde moment toegang krijgen tot het tekstbestand en dat het bestand dus wordt geblokkeerd door persoon 1 als persoon 2 de waarde ín het bestand wil verhogen... gevolg is dat de server er van uit gaat dat het bestand er niet is, en dus vrolijk uitgaat van 0 vorige bezoekers en dus gewoon een 1 wegschrijft.
Om dit te voorkomen heb ik natuurlijk van alles geprobeerd, en ik had zelf de hoop gevestigd op de flock functie, maar ook dat werkt niet... De teller blijft zichzelf resetten (overigens ook bij andere tekstbestanden waarbij ik de functie aanroep).
De codes die ik tot nu toe heb gebruikt, heb ik zelf geschreven en zijn eigenlijk allemaal hetzelfde- alleen de syntax is hooguit iets anders.
Ik kan niet verklaren waarom het tekstbestand soms wordt gereset... als het niet is gelockt, zou het nl. helemaal niet mogen worden aangepast... Verder heb ik nog met de variabelen achter fopen gespeeld (wb+, r+, etc...), maar dat biedt ook geen soelaas... helaas.
De read/write-code op de server van het tekstbestand is 666, overigens...
Het werkt extreem simpel;
- er wordt een tekstbestandje geopend
- daarin staat een getal (bv. 245)
- bij elke pageview wordt dat getal opgehoogd met 1 (bv. 246)
- daarna wordt het geupdate tekstbestand weggeschreven
Ik denk zelf dat het komt doordat twee bezoekers op exact hetzelfde moment toegang krijgen tot het tekstbestand en dat het bestand dus wordt geblokkeerd door persoon 1 als persoon 2 de waarde ín het bestand wil verhogen... gevolg is dat de server er van uit gaat dat het bestand er niet is, en dus vrolijk uitgaat van 0 vorige bezoekers en dus gewoon een 1 wegschrijft.
Om dit te voorkomen heb ik natuurlijk van alles geprobeerd, en ik had zelf de hoop gevestigd op de flock functie, maar ook dat werkt niet... De teller blijft zichzelf resetten (overigens ook bij andere tekstbestanden waarbij ik de functie aanroep).
De codes die ik tot nu toe heb gebruikt, heb ik zelf geschreven en zijn eigenlijk allemaal hetzelfde- alleen de syntax is hooguit iets anders.
Ik kan niet verklaren waarom het tekstbestand soms wordt gereset... als het niet is gelockt, zou het nl. helemaal niet mogen worden aangepast... Verder heb ik nog met de variabelen achter fopen gespeeld (wb+, r+, etc...), maar dat biedt ook geen soelaas... helaas.
De read/write-code op de server van het tekstbestand is 666, overigens...
PHP:
1
2
3
4
5
6
7
8
| $FileName = 'counter.txt' $CountFile = fopen ($FileName, 'wb+'); if(flock($CountFile,LOCK_EX)) { fwrite($CountFile,$ToonUpdate); flock($CountFile,LOCK_UN); } fclose($CountFile); |
PHP:
1
2
3
4
5
6
7
8
9
| $FileName = 'counter.txt' $fp = fopen($FileName, "r+"); if (flock($fp, LOCK_EX)) // do an exclusive lock { ftruncate($fp, 0); // truncate file fwrite($fp, $ToonUpdate); flock($fp, LOCK_UN); // release the lock } fclose($fp); |
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| $the_file = 'counter.txt'; // het bestand met de counter-data $the_data = 3421; // het counter-getal dat moet worden weggeschreven $fh = fopen($the_file,'wb+'); $tries = 3; while ($tries > 0) { $locked = flock($fh,LOCK_EX | LOCK_NB); if(!$locked){sleep(5);$tries--;} else{$tries = 0;} } if ($locked) { fwrite($fh,$the_data); fflush($fh); flock($fh,LOCK_UN); fclose($fh); } |
[ Voor 3% gewijzigd door b2vjfvj75gjx7 op 05-09-2010 11:54 ]