Calocybe: Perl-Prozesse synchronisieren - oder: Wie baue ich einen Counter?

Beitrag lesen

Hallo Cheatah!

Irgendwie habe ich schon erwartet, dass Du es sein wuerdest, der (als erstes) eine Antwort schreibst - Vielen Dank. :-)

ich habe das bei mir gelöst, indem ich einfach counter.pl?page=Seitenname aufrufe.

Ja, die Idee hatte ich auch schon, und nun werde ich es auch so machen, aber schoen ist es nicht :-(  Denn wenn man den Aufruf-Code von einer in die andere HTML-Datei kopiert, darf man nicht vergessen, die Zeile anzupassen. Und wenn Du Deine Counter rumreichst, besteht doch immer die Gefahr, dass mal zwei Leute denselben Identifier angeben, oder?

Wie man das mit der aufrufenden Datei macht kann ich Dir leider auch nicht sagen, aber ein Counter (inzwischen countermania.de) hatte das mal versucht und arge Probleme damit gehabt, weil einige Browser den HTML-Referrer zurücklieferten, also das was document.referrer ist.

Ja, meiner offensichtlich auch (NS 4.08). Aber bei GeoCities scheint es sehr gut zu funktionieren.

2. [...] Nehmen wir mal an, dass zwei HTML-Seiten fast gleichzeitig aufgerufen werden, und dann fast gleichzeitig der Counter aufgerufen wird, dann laufen doch zwei Perl-Prozesse unabhaengig voneinander, oder? [...]

Oh, ein leidiges Thema...

Ja, das ist sicher schonmal jemandem vor mir aufgefallen...

1.) Vor dem Lesen der Datei $filename prüfst Du
    while (-e "$filename.flock" && $flockcount < 5000) { $flockcount++; }
2.) Vor dem Schreiben der Datei $filename erstellst Du $filename.flock mit einem Dummy-Wert:
    open(FLOCK,"$filename.flock");
    print FLOCK "1";
    close(FLOCK);
3.) Nach dem Schließen der Datei $filename führst Du system("rm $filename.flock") aus.

Werden Variablen ($filename) also auch *innerhalb* von Anfuehrungszeichen aufgeloest? Das gibt es in keine anderen Sprache... (Ok, ich kenne natuerlich nicht alle auf der Welt). Oder hast Du das jetzt nur so zum Zeigen hingeschrieben? (Ich probier's aus)
OK. Sieht gut aus, aber so ist die Sache verdammt abhaengig von der Geschwindigkeit des Systems. Ich wuerde etwas, wie sleep() einbauen, aber die kleinste Aufloesung ist dort 1 ganze Sekunde (eine Ewigkeit!). Und zu 3.) Das geht doch sicher nur auf einem UNIX-Rechner, bei MS heisst es doch DEL. Aber es gibt da auch eine Perl-Funktion - unlink() - wie ich gesehen habe.

Nach Punkt 1 kannst Du noch prüfen, ob $flockcount den Wert 5000 erreicht hat. In dem Fall ist die Datei $filename.flock vermutlich durch einen Systemabbruch fehlerhaft noch existent,

Naja, oder der Server-Rechner war zu schnell.

Viel Glück, und halt mich bitte über Deine Fortschritte auf dem Laufenden :-)

OK, ich melde mich, wenn ich fertig bin - oder wieder Fragen habe :-)

Thanx, Calocybe