2012-12-19 4 views
5

Lassen Sie uns sagen, dass wir eine Lock-Skript müssen, dass wir zwei Skripte stellen Sie sicher, nie zur gleichen Zeit ausgeführt wird:file_get_contents erscheint Caching, Lock-Skript Problem sein

if(file_get_contents('test.txt')) { // this is always empty... 
    die("Another script is running in background!"); 
} 
file_put_contents('test.txt', 'busy!'); 
sleep(10); // heavy work here 
file_put_contents('test.txt', ''); 

erlaubt es mir immer noch an denselben zwei Skripts ausführen Zeit. Es sieht aus wie Ergebnis von file_get_contents() sind im Cache?

Wie es zu beheben? Ich möchte Dateien verwenden, nicht DB.


Edit: Ich schaffte es bereits das Schloss-Skript zu tun mit flock() (dank Levi Morrison)

Auf jeden Fall bin ich immer noch neugierig, warum file_get_contents Werke in so unerwartetes Verhalten?

+3

Siehe [flock] (http://php.net/manual/en/function.flock.php). –

+0

Es sollte keine Zwischenspeicherung geben. Ich bin nur neugierig, was passiert, wenn Sie manuell etwas in die Datei schreiben und Ihr Skript ausführen? – Ranty

+0

@LeviMorrison sieht gut aus, aber was ist mit 'file_get_contents()'? – Peter

Antwort

2

Ich konnte es reproduzieren und das Problem darstellen. Zuerst sah es so aus, wie du es beschrieben hast: Ich habe das Skript im Browser angefragt und während des Laufens habe ich den Dateiinhalt überprüft - es war busy!. Dann lief ich zweites Skript und im Browser war es auch Laden, das gleiche wie das erste. Ich dachte, es läuft auch, , aber es war nicht.

Es ist ziemlich einfach zu Figur, wenn statt busy! Sie etwas zufällig verwenden, wie:

file_put_contents('test.txt', 'busy washing ' . (mt_rand(1, 999) * 99999) . ' dishes'); 

Führen Sie die gleichen zwei Skripte die gleiche Art und Weise und Dateiinhalte überwachen. Zuerst wird es sein, was das erste Skript geschrieben hat. Sagen Sie busy washing 1 dishes. Dann werden Sie feststellen, dass sich der Inhalt zu dem ändert, was das zweite Skript schreibt, die Nummer wird anders sein.

Im Grunde, was passiert, ist das zweite Skript wartet, während zuerst beendet wird und erst dann startet. Lustigerweise löscht das erste Skript die Datei, wodurch das zweite Skript normal ausgeführt werden kann, aber es sieht im Browser so aus, als würden beide gleichzeitig arbeiten. Tatsächlich läuft das zweite Skript doppelt so lange wie das erste.

Ich habe dieses Verhalten bei schweren asynchronen Anfragen über AJAX und Anforderung der gleichen Website-Seite in einem anderen Browser Registerkarte aufgetreten. Bis das Skript beendet ist, konnte ich die Registerkarte nicht laden.

So lange Geschichte kurz, es gibt kein Problem! Wenn Sie diese Skripte über Cron in die Warteschlange stellen, werden sie separat ausgeführt und die zweite wird beendet, indem Sie feststellen, dass die Datei nicht leer ist.

+0

Und wenn Sie die gleiche Nummer zweimal hintereinander generieren? –

+0

@LeviMorrison Die Nummer soll zeigen, dass das Problem nicht existiert. Es hat nichts mit dem Sperren von Dateien zu tun, besonders im Zusammenhang mit 'if (file_get_contents ('test.txt')) {}' – Ranty

+0

@Ranty ja das wars. durch die Konsole alles ist in Ordnung – Peter