Dateisperren für Downloadzähler
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
attribut
beispiel
dank
datei
denkfehler
fehlschlag
frage
gleichzeitigen zugriff
inhalt
kommando
operation
problem
sperre
sperren
theoretisch passieren
url
versuchen
warten
warteschleife
zugriff
-
Ich versuche derzeit einen Downloadzähler innerhalb einer normalen Textdatei anzulegen.
Das stellt von der Programmierung her kein Problem dar, ich hab da allerdings eine Frage zu den Dateisperren.
PHP sperrt Dateien ja nicht von sich aus, solange man das nicht explizit per Kommando angibt, oder?
Was ich vermeiden möchte, ist bei einem eventuell auftrenden gleichzeitigen Zugriff zum Erhöhen des Zählers ein Scenario wie dieses:
Angenommen, die Zahl in der Datei lautet 42.
- Script 1 öffnet die Datei
- Script 1 liest den Inhalt der Datei aus, weiß, dass der Zähler 42 ist
- Script 2 öffnet die Datei
- Script 1 löscht den Inhalt der Datei
- Script 2 liest den Inhalt der Datei aus - und stellt fest: sie ist leer, nimmt daher 0 an
- Script 1 schreibt 43 in die Datei
- Script 1 schließt die Datei
- Script 2 löscht den Inhalt der Datei
- Script 2 schreibt 1 in die Datei
- Script 2 schließt die Datei
Um die Datei zu sperren, habe ich in PHP nun folgendes Kommando entdeckt:
bool flock (resource $handle, int $operation [, int &$wouldblock])
Als $handle wird dann einfach der Wert von "fopen()" übergeben.
Das Attribut $operation beschreibt einfach, ob die Datei gesperrt oder entsperrt werden soll.
Das Attribut $wouldblock soll laut Anleitung angeben, ob das zweite Script auf das entsperren warten, oder abgebrochen werden soll.
Frage: Wie lange würde das zweite Script warten? Gibts hier ein Timeout?
Desweiteren fällt mir zum Sperren dann noch folgendes Scenario ein.
Was wäre, wenn beide Scripte die Datei bereits geöffnet hatten, bevor eines von beiden sie sperren konnte....also wenn der Zugriff wirklich extrem zeitgleich verlief.
Beispiel:
- Script 1 öffnet die Datei
- Script 2 öffnet die Datei
- Script 1 sperrt die Datei
Das ist wohl sehr unwarscheinlich, dass das so zustande kommt....aber ist es möglich?
Wie würdet ihr sowas am besten anstellen?
Ich will für einen reinen Downloadzähler den Benutzer nicht zwingen müssen, eine Datenbank zu installieren, nur um die Abfragen in Warteschleifen packen zu können.
Ich will mich hier auch von SQLite fernhalten....mir erscheint der Aufwand für sowas simples wie einen Downloadzähler da einfach zu hoch.
Beitrag zuletzt geändert: 27.2.2013 8:54:17 von adelwoehrer -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
schau mal hier nach:
http://php.net/manual/en/function.flock.php
Für dich sind die Beispiele mit sleep() bzw. usleep() von Interesse.
Am passendsten ist die Benutzeranmerkung 2. -
Ah, also einfach bei Fehlschlag eines locks ein sleep() und danach nochmal versuchen.
Das löst das erste Problem mit dem gleichzeitigen Dateizugriff, danke.
Was jetzt noch bleibt, ist die Frage, ob das hier theoretisch passieren könnte, wenn zeitgleich auf die Datei zugegriffen wird:
- Script 1 öffnet die Datei
- Script 2 öffnet die Datei
- Script 1 prüft Sperre (nicht gesperrt)
- Script 2 prüft Sperre (bevor Datei von Script 1 gesperrt wurde) (nicht gesperrt)
- Script 1 sperrt Datei
In diesem Fall würde das sleep() nicht getriggert werden, weil beide Scripte das "Go" zum Sperren haben.
Beitrag zuletzt geändert: 27.2.2013 10:49:33 von adelwoehrer -
adelwoehrer schrieb:
Ah, also einfach bei Fehlschlag eines locks ein sleep() und danach nochmal versuchen.
Das löst das erste Problem mit dem gleichzeitigen Dateizugriff, danke.
Was jetzt noch bleibt, ist die Frage, ob das hier theoretisch passieren könnte, wenn zeitgleich auf die Datei zugegriffen wird:
- Script 1 öffnet die Datei
- Script 2 öffnet die Datei
- Script 1 prüft Sperre (nicht gesperrt)
- Script 2 prüft Sperre (bevor Datei von Script 1 gesperrt wurde) (nicht gesperrt)
- Script 1 sperrt Datei
In diesem Fall würde das sleep() nicht getriggert werden, weil beide Scripte das "Go" zum Sperren haben.
Script2 prüft erneut ob Datei gesperrt ist. -
Denkfehler meinerseits....der Befehl zum Sperren der Datei gibt ja auch bool zurück.
In diesem Sine schlägt dann spätestens das Kommando fehl, wenn die Prüfung nicht klappt.
Danke, Problem gelöst. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage