php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 17-02-2008, 23:41
doppelstern
 Newbie
Links : Onlinestatus : doppelstern ist offline
Registriert seit: Feb 2008
Beiträge: 3
doppelstern ist zur Zeit noch ein unbeschriebenes Blatt
Standard Kleines Counter-Problem

Hallo

Vielleicht kann mir jemand helfen:
Seit mehreren Monaten benutze ich einen selbstgeschriebenen PHP-Counter auf Textdateibasis.
Dabei tritt in rein zufälligen Zeitabständen das Problem auf, das der Counterstand auf 0 gesetzt wird,
was natürlich nicht sein darf. Ich komme einfach nicht dahinter, warum das so ist.
Hat jemand eine Idee woran es liegen könnte?
Hier der komplette Quellcode des Counters:

PHP-Code:
<?php
/* --------------------------- KONFIGURATION ------------------------------ */

$pfad         "counter/";      /* Pfad zum Counterordner */
$counter         0;         /* Counter Startwert */
$sperrzeit    3600;           /* IP-Sperrzeit in Sekunden */

/* --------------------------- KONFIGURATION ENDE ------------------------- */

$ip                 getenv("REMOTE_ADDR");
$max                 1000;
$zeit             time();
$ip_exist     false;

/* --------------------------- Neue Datei anlegen ------------------------- */
if(!file_exists($pfad."counter.txt"))
{
  
$counter++;
    
$daten         = array();
  
$daten[0] = $counter;
  
$daten[1] = $ip;
  
$daten[2] = $zeit;
    
$teile        implode("|"$daten);
    
$handle     = @fopen($pfad."counter.txt""a");
  @
fputs($handle$teile);
  @
fclose($handle);
}

/* --------------------------- Daten aus Datei lesen ---------------------- */
$read_handle = @fopen($pfad."counter.txt""r+");
@
flock($read_handle,LOCK_SH);
$daten    = @fgets($read_handle);
@
flock($read_handle,LOCK_UN);
@
fclose($read_handle);
$teile    explode("|"$daten);
$anzahl    =    count($teile);

/* -- Datei aufräumen, wenn bestimmte Besucheranzahl überschritten wird --- */
if($anzahl $max)
{
    for(
$n=1$n<$anzahl$n++)
  {
      unset (
$teile[$n]);
  }
    
$anzahl 1;
}

/* -- Prüfen, ob IP schon gespeichert und dessen Sperrzeit überschritten ist -- */
for($n=1$n<$anzahl$n++)
{
    if(
$teile[$n] == $ip)
  {
      
$ip_exist true;
       if(
$zeit $teile[$n+1]+$sperrzeit)
      {
            
$ip_exist false;
      unset (
$teile[$n]);
      unset (
$teile[$n+1]);
            break;
    }
  }
}

/* --------------------------- Daten ändern & speichern ------------------- */
if($read_handle == true)
{
    if(
$ip_exist == false)
    {
      
$teile[0]++;
      
$teile[]  = $ip;
      
$teile[]  = $zeit;
      
$daten    implode("|"$teile);
      
$handle   = @fopen($pfad."counter.txt""w");
      @
flock($handle,LOCK_EX);
      @
fputs($handle$daten);
      @
flock($handle,LOCK_UN);
      @
fclose($handle);
    }
    echo 
$teile[0];
}
?>
Mit Zitat antworten
  #2 (permalink)  
Alt 18-02-2008, 14:49
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Entferne alle @s, setze display_errors=off, error_reporting=E_ALL und per error_log=<dateiname> lass dir eventuelle Fehler in eine Datei schreiben.
Mit Zitat antworten
  #3 (permalink)  
Alt 18-02-2008, 14:56
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

display_errors=on
Mit Zitat antworten
  #4 (permalink)  
Alt 18-02-2008, 22:42
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von PHP-Desaster
display_errors=on
Ne, eben gerade nicht, damit die Fehler nicht jedem Benutzer um die Ohren gekloppt werden ^^,
Mit Zitat antworten
  #5 (permalink)  
Alt 18-02-2008, 23:06
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Ne, eben gerade nicht, damit die Fehler nicht jedem Benutzer um die Ohren gekloppt werden ^^,
Hehe, hast recht, habe dein error_log wohl verdrängt
Für das direkte Debuggen kann er natürlich auf das Log verzichten!
Mit Zitat antworten
  #6 (permalink)  
Alt 20-02-2008, 08:11
doppelstern
 Newbie
Links : Onlinestatus : doppelstern ist offline
Registriert seit: Feb 2008
Beiträge: 3
doppelstern ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Danke.
"error_log" wäre ja eventuell was um der Sache auf die Spuhr zu kommen. Etwas blöd nur, das es unter umständen Wochen oder gar Monate dauern kann bis der besagte Fehler wieder einmal auftritt.
Mit "error_reporting=E_ALL" und ohne @ entwerfe und teste ich übrigens grundsätzlich alle PHP-Scripte - is ja klar.

Ich dachte mir, das vielleicht doch noch jemand einen Fehler im Code entdeckt, denn lang oder unübersichtlich ist je ja nun wirklich nicht.

Mir fällt ein, ich muss noch etwas wichtiges zum Code sagen:
Der Startwert der Variable "$counter" ist bei mir in der Praxis nicht = 0,
so wie oben im Quellcode zu sehen ist (sondern liegt derweil bei über 50000). Ich halte dies für wichtig zu erwähnen, denn durch diese Tatsache lässt sich ausschliessen, das ein gelegentliches löschen der Countertextdatei (aus welchem Grund auch immer) auszuschliessen ist,
da der Counterstand nach auftreten des Fehlers immer bei 0 beginnt.
Nach dem löschen der Countertextdatei würde vom Script also eine neue Countertextdatei angelegt, deren Startwert nicht gleich 0 sein kann.

Die Problematik ist mir ein echtes Rätzel

Geändert von doppelstern (20-02-2008 um 08:22 Uhr)
Mit Zitat antworten
  #7 (permalink)  
Alt 20-02-2008, 11:52
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Mal so eine ganz blöde Frage am Rande: Wieso benutzt du nicht einfach eine Datenbank?
Ich kann mir kaum vorstellen, dass dieses ganze Rumgespiele mit den Locks performant ist (allein schon deshalb, weil eine zu große Anzahl von Einträgen eventuell gleich von mehreren Skriptaufrufen bereinigt wird) und abgesehen davon funktioniert das ja eh nicht immer (per NFS z.B. nicht)

Wenn du einfach eine Datenbank nimmst, kann dir die Anzahl der Einträge egal sein, du kannst alles mögliche an Werten einfacher speichern (IP, eventuell kombiniert mit UserAgent), per Unique-Key darauf kannst du dir das Auslesen der Datenbank selber sparen und einfach per REPLACE INTO die Datensätze einfügen,
und wenn du Lust hast noch per random oder Cronjob die Tabelle alle 15 Minuten einmal leeren lassen oder so, was MySQL auch so praktisch gar nicht kratzt.

Ich bin kein Freund von Text-Dateien
Mit Zitat antworten
  #8 (permalink)  
Alt 20-02-2008, 16:12
doppelstern
 Newbie
Links : Onlinestatus : doppelstern ist offline
Registriert seit: Feb 2008
Beiträge: 3
doppelstern ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Sicherlich hast du da recht. Zu der Zeit als ich den Counter programmierte waren meine beiden DB die zur Verfügung stehen schon belegt (Gästebuch und Linkliste). Derweil ist eine davon wieder frei geworden, da ich die Linkliste nun manuell manage.
Es würde mich zum einen nur etwas ärgern, dieses ansich schöne Script auf den Müll zu werfen und zum anderen könnte es sein, das ich die derzeit freie DB später noch für eine Kunden-Datenverwaltung benötige.
Es ist natürlich auch eine Frage des Ehrgeizes, diesen Fehler zu finden und zu beseitigen. Zudem lerne ich dabei ja auch etwas dazu, denn dieser Fehler ist schon etwas seltsam und ich möchte doch zugern wissen, woran es liegt.

Eine Theorie die ich habe wäre, das es vielleicht unter ungünstigen Umständen zu einem Dateizugriffskonflikt kommt, wenn zwei oder mehrere Besucher auf die Countertextdatei zur selben Zeit zugreifen. Der Pointer dabei Daten an einer falschen Position einliest. Vielleicht passiert das gerade in dem Augenblick, wo die Countertextdatei "aufgeräumt" wird. Aber eigentlich müsste der Einsatz von "flock" dies ja verhindern.
Könnte es sein, das "flock" falsch positioniert ist? Vielleicht sollte "flock" besser direkt zu Anfang und am Ende des Sripts stehen und nicht für jeden Dateizugriff einzeln gesetzt werden? Oder ist jemanden bekannt, das "flock" fehlerhaft arbeitet?

Geändert von doppelstern (20-02-2008 um 16:14 Uhr)
Mit Zitat antworten
  #9 (permalink)  
Alt 20-02-2008, 16:48
H2O
 PHP Junior
Links : Onlinestatus : H2O ist offline
Registriert seit: Jul 2007
Beiträge: 937
H2O ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von doppelstern
SZu der Zeit als ich den Counter programmierte waren meine beiden DB die zur Verfügung stehen schon belegt
Du brauchst dazu doch keine eigene DB, da ist doch eine Tabelle innerhalb einer bestehenden DB mehr als genug.
flock() funktioniert meines Wissens nur, wenn immer auf die gleiche Art zugeriffen wird. Du merkst das auch daran, dass du eine exklusiv gelockte Datei problemlos manuell editieren kannst.
__________________
Gruss
H2O
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

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 are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 21:25 Uhr.