Zurück   Flashforum > Flash und Server > Server-Seite allgemein

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 05-10-2007, 23:34   #1 (permalink)
Neuer User
 
Benutzerbild von qzeta
 
Registriert seit: Aug 2007
Beiträge: 77
Counter resetet sich

Hallo,
hat jemand eine Ahnung warum sich der angehängte Counter immer wieder resetet...? Passiert bei ca. 1200 Klicks auf www.gemberlin.com
__________________
Gruß und Chris
qzeta ist offline   Mit Zitat antworten
Alt 05-10-2007, 23:35   #2 (permalink)
Neuer User
 
Benutzerbild von qzeta
 
Registriert seit: Aug 2007
Beiträge: 77
ups...
Angehängte Dateien
Dateityp: rar counter.rar (868 Bytes, 8x aufgerufen)
__________________
Gruß und Chris
qzeta ist offline   Mit Zitat antworten
Alt 06-10-2007, 01:08   #3 (permalink)
Inventar
 
Benutzerbild von Nightflyer
 
Registriert seit: Jul 2002
Beiträge: 6.882
Auch wenn der Code sichtlich alt und unübersichtlich ist kann ich keinen Fehler entdecken der das verursachen könnte. Vielmehr denke ich dass es mit eine sog. "race-condition" zusammenhängt. User A liest Counter aus und schreibt neuen Wert in Datei. Gleichzeitig versucht User B den Wert auszulesen was jedoch nicht geht da User A grade am Schreiben ist. Zu lösen wäre dieses Problem mit einer Sperre ( siehe flock() ).

PS: Rechte an den Lieder hast du?
__________________
(\__/)
(='.'=)
(")_(")
Nightflyer ist offline   Mit Zitat antworten
Alt 06-10-2007, 13:47   #4 (permalink)
Neuer User
 
Benutzerbild von qzeta
 
Registriert seit: Aug 2007
Beiträge: 77
ja stimmt, das script ist ziemlich alt. hatte ich vor einiger zeit irgendwo im web ausgegraben. bisher hatte ich keine probleme entdeckt mit gleichzeitigem auslesen und schreiben - sonst würde doch ein "undefined" als wert ausgegeben? das problem ist eher, dass die counter.txt bereits zum zweiten mal auf 0 gesetzt wurde.
Jetzt habe ich die counter.txt in ein geschüztes verzeichnis gesteckt... vieleicht hilft das ja...? oder habe ich da was falsch verstanden?

die musik ist bei der GEMA angemeldet...

danke für die hilfe
__________________
Gruß und Chris
qzeta ist offline   Mit Zitat antworten
Alt 08-10-2007, 09:24   #5 (permalink)
Neuer User
 
Benutzerbild von qzeta
 
Registriert seit: Aug 2007
Beiträge: 77
ok... scheint so als hätte ich definitiv etwas falsh verstanden.
der counter resetet sich immernoch andauernd.
habe ein neues script gefunden. hier für alle die es interessiert...
PHP-Code:
<?
function schreiben($datei,$mode) { 
   global 
$REMOTE_ADDR
   
$fp = @fopen($datei,$mode); 
   
flock($fp,2); 
   
fwrite($fp,$REMOTE_ADDR."|".time()."\n"); 
   
flock($fp,3); 
   
fclose($fp); 


function 
ip_sperre() { 
   global 
$REMOTE_ADDR
   
$reloadlogdatei "counter/ip.txt"
   
$anzahleintraege 50// nach sovielen ip´s werden die alten gelöscht
   
$zeitlimit 7200// solange bleibt eine ip gesperrt (in sec.)
    
   // prüfen ob datei existiert wenn nicht erstellen
   
if(!file_exists($reloadlogdatei)) { 
      
$datei fopen($reloadlogdatei,"w+"); 
      
fclose($datei); 
   } 
   
$fp file($reloadlogdatei); 
   
$size sizeof($fp); 

   
// beschreibt die Datei, wenn Liste voll 
   
if($size >= $anzahleintraege){ 
      
schreiben($reloadlogdatei,"w"); 
      
// Prüft, ob eine IP in der Liste steht 
   
}
   else { 
     
$ausgabe=false;
for (
$i=0;$i<$size;$i++) { 
   
$zeile explode("|",$fp[$i]); 
   if (
$zeile[0] == $REMOTE_ADDR AND $zeile[1] > (time()-$zeitlimit)){ 
      
// ip wird gefunden 
      
$ausgabe true
   }
}  
      
// protokolliert die ip 
      
schreiben($reloadlogdatei,"a+"); 
   } 
   return 
$ausgabe
}


$fn "counter/counter.txt";
if (
file_exists($fn))
{
// counterstand auslesen
$fp fopen($fn,"r");
$zahl fgets($fp,10);
fclose($fp);
}
else
// beim ersten aufruf..
$zahl 0;

// counterstand erhöhen...
echo "wert=$zahl";

if (
ip_sperre()==false)
{
// neu schreiben
$zahl $zahl+1;
$fp fopen($fn,"w");
flock($fp,2);
fputs($fp,$zahl);
flock($fp,3);
fclose($fp);
}
?>
__________________
Gruß und Chris
qzeta ist offline   Mit Zitat antworten
Alt 08-10-2007, 09:53   #6 (permalink)
Inventar
 
Benutzerbild von Nightflyer
 
Registriert seit: Jul 2002
Beiträge: 6.882
Ich kann die Verwendung einer IP-Sperre nicht nachvollziehen. Die IP der meisten User wechselt ja sowieso andauernd. Sonnvoller wäre IMHO einfach ein Cookie beim Nutzer absetzen und danach zu prüfen. Hast du PHP5? Wenn ja mach ich dir schnell ein kleines Script welches funktioniert
__________________
(\__/)
(='.'=)
(")_(")
Nightflyer ist offline   Mit Zitat antworten
Alt 08-10-2007, 10:03   #7 (permalink)
Neuer User
 
Benutzerbild von qzeta
 
Registriert seit: Aug 2007
Beiträge: 77
ja habe php 5.2.2 zur verfügung. wäre echt fein die sache mit einem cookie zu regeln. danke für die angebotene hilfe
__________________
Gruß und Chris
qzeta ist offline   Mit Zitat antworten
Alt 08-10-2007, 10:48   #8 (permalink)
Inventar
 
Benutzerbild von Nightflyer
 
Registriert seit: Jul 2002
Beiträge: 6.882
So, noch nicht geprüft ob es überhaupt funktioniert aber so in etwa sollte es in PHP5 schon aussehen

PHP-Code:
<?php

class counter{
    
    var 
$counter;
    var 
$cookiename $_SERVER['HTTP_HOST'];
    var 
$counterfilename 'counter.txt';
    
    function 
checkCookie(){
        
        return isset( 
$_COOKIE$this->cookiename ] );
        
    }
    
    function 
set_Cookie(){
        
        
setcookie$this->cookiename );
        
    }
    
    function 
getCounter(){
        
        return 
file_get_contents$this->counterfilename );
        
    }
    
    function 
counterCountAndSave(){
        
        
file_put_contents$this->counterfilename$this->counter );
        
    }
    
    function 
returnCounterValue(){
        
        return 
"&wert=".file_get_contents$this->counterfilename );
        
    }
    
    function 
__construct(){
        
        if( 
$this->checkCookie() === false ){
            
            
$this->set_Cookie();
            
        }else{
            
            return 
false;
            
        }
        
        
$this->counter $this->getCounter();
        
$this->counterCountAndSave();
        
    }
    
}

$counter = new counter;
echo 
$counter->returnCounterValue();
__________________
(\__/)
(='.'=)
(")_(")
Nightflyer ist offline   Mit Zitat antworten
Alt 08-10-2007, 11:02   #9 (permalink)
Neuer User
 
Benutzerbild von qzeta
 
Registriert seit: Aug 2007
Beiträge: 77
ich bin ja nicht gerade eine php-leuchte...
verstehe ich es richtig, dass dieses script ein kompletter counter ist...?
oder muß ich in meinem script die ip-sperre dadurch ersetzen.
bin ein bißchen verwirrt
__________________
Gruß und Chris
qzeta ist offline   Mit Zitat antworten
Alt 08-10-2007, 11:43   #10 (permalink)
Inventar
 
Benutzerbild von Nightflyer
 
Registriert seit: Jul 2002
Beiträge: 6.882
So, habe das Script noch ein bischen verfeinert und getestet. Müsste funktionieren. Ja das Script ist ein kompletter Counter - eine IP-Sperre gibt es nicht mehr stattdessen basiert es wie vorgeschlagen auf einer Cookie-Sperre.

PHP-Code:
<?php

error_reporting
(E_ALL);

class 
counter{
    
    var 
$counter;
    var 
$cookiename;
    var 
$counterfilename;
    
    function 
checkCookie(){ //Prüfen ob Cookie vorhanden
        
        
return (bool) isset( $_COOKIEstr_replace".""_"$this->cookiename ) ] );
        
    }
    
    function 
set_Cookie(){ //Neues Cookie setzen
        
        
return (bool) setcookiestr_replace".""_"$this->cookiename ), 0time()+3600*24*);
        
    }
    
    function 
getCounter(){ //Counter auslesen
        
        
$counter file_get_contents$this->counterfilename );
        
        if( 
$counter === false ){
            
            
touch$this->counterfilename );
            return 
0;
            
        }
        
        return (int) 
$counter;
        
    }
    
    function 
counterCountAndSave(){ //Counter hochzählen und speichern
        
        
file_put_contents$this->counterfilename$this->counter );
        
    }
    
    function 
returnCounterValue(){ //Counter zurückgeben
        
        
return "&wert=".( $this->counter );
        
    }
    
    function 
__construct(){ 
        
        
$this->cookiename $_SERVER['HTTP_HOST'];
        
$this->counterfilename 'counter.txt';
        
        if( 
$this->checkCookie() === false ){
            
            if( 
$this->set_Cookie() === false ){
                
                die(
"Cookie konnte nicht gesetzt werden");
                
            }
            
        }else{
            
            return 
false;
            
        }
        
        
$this->counter $this->getCounter();
        
$this->counterCountAndSave();
        
    }
    
}

$counter = new counter;
echo 
$counter->returnCounterValue();
__________________
(\__/)
(='.'=)
(")_(")
Nightflyer ist offline   Mit Zitat antworten
Alt 08-10-2007, 14:06   #11 (permalink)
Neuer User
 
Benutzerbild von qzeta
 
Registriert seit: Aug 2007
Beiträge: 77
danke für das script echt wahnsinnig, wie du sowas in kürzester zeit erstellen kannst...
beim ersten aufruf der seite funktionierte es auch wunderbar...
bei jedem weiteren aufruf wird nur noch die "1" angezeigt...?
lösch ich die cookies, stimmt der wert wieder...usw...

www.gemberlin.com
__________________
Gruß und Chris

Geändert von qzeta (08-10-2007 um 14:06 Uhr) Grund: url
qzeta ist offline   Mit Zitat antworten
Alt 08-10-2007, 14:37   #12 (permalink)
Inventar
 
Benutzerbild von Nightflyer
 
Registriert seit: Jul 2002
Beiträge: 6.882
fein, dann ist ja alles in Butter
__________________
(\__/)
(='.'=)
(")_(")
Nightflyer ist offline   Mit Zitat antworten
Alt 08-10-2007, 14:57   #13 (permalink)
Inventar
 
Benutzerbild von Nightflyer
 
Registriert seit: Jul 2002
Beiträge: 6.882
Zitat:
echt wahnsinnig, wie du sowas in kürzester zeit erstellen kannst...
Nur Übung...
__________________
(\__/)
(='.'=)
(")_(")
Nightflyer ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 11:07 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele