dedlfix: Zufallszahl berechnen aber nur alle Stunden

Beitrag lesen

Tach!

Du legst eine Date an: random.houerly.csv Inhalt:

Viele Wege führen nach Rom. Alternativ kann man auch einen Datenbank-Eintrag nehmen, besonders dann, wenn man sowieso schon seine Daten in einer Datenbank verwaltet.

Der OP hat seinen Anwendungsfall nicht genau genug beschrieben. Daraus geht nicht hervor, ob die Zufallszahl für alle Anwender gleichermaßen gelten soll, oder jeder Besucher seine eigene Zufallszahl bekommt. Im zweiten Fall kann man eine Session nehmen - im ersten Fall auch. Dazu gleich mehr.

Der Lösungsansatz mit der Datei hat den Nachteil, dass man ein beschreibbares Verzeichnis vorliegen haben oder erstellen muss. Das ist nicht unbedingt erstrebenswert, besonders dann nicht, wenn dieses Verzeichnis über das Web erreichbar ist und durch andere Sicherheitslücken beliebig ausführbare Dateien hochgeladen werden können. Abseits des DocumentRoot wäre ein besserer Ort.

Eine Datei in einem Multi-User-System zu verwenden, kann zu einem TOCTTOU-Problem (Time-of-Check-to-Time-of-Use-Problem) führen. Ein zweiter Prozess überschreibt das Ergebnis des ersten Prozesses, wenn dem zweiten nicht bewusst ist, dass da grad ein anderer Prozess am Werkeln ist. Das kann sich zu einem Fehler auswirken, der schwer zu greifen ist, weil er nur durch ganz bestimmte, schwer nachzustellende Voraussetzungen auftritt. Es kann auch sein, dass er nie auftritt oder seine Auswirkungen unentdeckt bleiben und auch keinen Schaden anrichten. Wenn man es jedenfalls richtig machen möchte, muss man sich um das Locking von Dateien kümmern.

Eine Datenbank kümmert sich auf Dateiebene selbst um den problemlosen parallelen Zugriff. Aber auch da hat man das TOCTTOU-Problem, wenn man keine Transaction einsetzt sowie Lesen und Schreiben in zwei getrennten Vorgängen stattfindet.

Und nun zur Session. Da kümmert sich PHP um problemlosen parallelen Zugriff. Eine Session ist üblicherweise user-individuell, aber man kann die Session-ID auch fest vorgeben. Dann kommt sozusagen jeder Besucher mit derselben SID und alle bekommen dieselbe Zahl. Die Vorteile gegenüber der Datei-Lösung sind, dass das Handling deutlich einfacher wird, besonders wenn man ansonsten eine vollständige Lösung mit Datei-Locking implementieren würde.

Zu Beachten ist, dass man durch entsprechende Konfiguration das Session-Daten-Verzeichnis (session.save_path) möglichst separat von denen von anderen Anwendungen hält, sowie die Lebenszeit mindestens eine Stunde beträgt. Anderenfalls wird die Session-Datei zu früh weggeräumt. Das gilt übrigens gleichermaßen für benutzerindividuelle und globale Sessions.

Eine weitere Möglichkeit wäre ein Cookie, aber das nur wenn der Anwendungsfall nutzerindividuell ist, und es auch nicht stört, wenn der Nutzer Cookies ablehnt.

dedlfix.