Hallo
Habe ein Problem mit meinem Counterscript für die Streambenutzung. Wenn zuviele Zugriffe auf einmal stattfinden wird die Textdatei quasi zerschossen. Die Einträge darin sind durcheinander oder fehlen und das Script zum auslesen kann die Daten nicht ausgeben "weil sie halt nicht da sind wo sie sein sollten oder ganz weg sind".
Hier das Script was die Hits zählt.
Das Script wird mit ?id=diswinamp usw. gestartet und der Hit in die counter.txt geschrieben bzw. addiert.
Ist das bei Flatfiles so oder habe ich etwas vergessen? bzw. gibt es eine Möglichkeit dieses Problem zu umgehen ohne auf Datenbank umzusteigen.
Edit:
Habe jetzt was gefunden wie man das Problem im Griff bekommt nur werde ich nicht schlau daraus wie ich das nun in meinem Script umsetzten kann, eventuell kennt sich hier ja ein Profi aus?
Gruß
Belee
Habe ein Problem mit meinem Counterscript für die Streambenutzung. Wenn zuviele Zugriffe auf einmal stattfinden wird die Textdatei quasi zerschossen. Die Einträge darin sind durcheinander oder fehlen und das Script zum auslesen kann die Daten nicht ausgeben "weil sie halt nicht da sind wo sie sein sollten oder ganz weg sind".
Hier das Script was die Hits zählt.
Das Script wird mit ?id=diswinamp usw. gestartet und der Hit in die counter.txt geschrieben bzw. addiert.
PHP:
$whitelist = array(
'diswinamp','displs','diswmp','disreal','disflash',
'itawinamp','itapls','itawmp','itareal','itaflash',
'oldwinamp','oldpls','oldwmp','oldreal','oldflash');
$file = file("data/links.txt"); //hier sind die echten Streamlinks eingetragen
foreach($file as $line) {
list($id,$url) = explode("|",$line);
$foo[$id] = $url;
}
if(empty($_GET['id'])) {
Header('Location: http://www.domain.eu');
}
elseif(isset($_GET['id']) & in_array($_GET['id'],$whitelist)) {
$url = $foo[$_GET['id']];
Header('Location: '.$url);
Header('Cache-Control: must-revalidate, pre-check=0, no-store, no-cache, max-age=0, post-check=0');
$id = $_GET['id'];
$date = date("d.m.y");
$time = date("H:i");
$countfile = "data/counter.txt"; //hier werden die ganzen Hits reingeschrieben
$file = file($countfile);
$fd = fopen($countfile,"w+");
foreach ($file as $line) {
$exp_line = explode("|", $line);
if ($exp_line[0] == $id) {
$count = $exp_line[1];
$count ++;
$new_line = "$id|$count|$date|$time\n";
fputs($fd, $new_line);
}
else {
fputs($fd, $line);
}
}
fclose($fd);
}
else {
Header('Location: http://www.domain.eu');
}
Ist das bei Flatfiles so oder habe ich etwas vergessen? bzw. gibt es eine Möglichkeit dieses Problem zu umgehen ohne auf Datenbank umzusteigen.
Edit:
Habe jetzt was gefunden wie man das Problem im Griff bekommt nur werde ich nicht schlau daraus wie ich das nun in meinem Script umsetzten kann, eventuell kennt sich hier ja ein Profi aus?
PHP:
For those who just want to check if a file is available for locking and return immediately (without blocking), use the following syntax:
<?php
$file = fopen('file.txt', 'w');
if(flock($file, LOCK_EX | LOCK_NB)){
echo 'Got lock, continue writing to file';
// Code to write to file
}else{
echo 'File is locked by another process, aborting writing';
// Couldn't obtain the lock immediately
}
?>
This is a quick, easy way to determine if another process is using the file or not, without blocking your script.
Gruß
Belee
Zuletzt bearbeitet: