fopen Dateisperrung in PHP (Lese- / Schreibsituation)

Ich habe ein Szenario, in dem ein PHP-Prozess ungefähr dreimal pro Sekunde eine Datei schreibt und dann mehrere PHP-Prozesse diese Datei lesen.

Diese Datei ist im Wesentlichen ein Cache. Unsere Website verfügt über ein sehr hartnäckiges Polling für Daten, die sich ständig ändern, und wir möchten nicht, dass jeder Besucher bei jedem Polling auf die Datenbank zugreift. Daher haben wir einen Cron-Prozess, der die Datenbank dreimal pro Sekunde liest und die Daten verarbeitet. und speichert es in einer Datei, die die Polling-Clients dann lesen können.

Das Problem, das ich habe, ist, dass das Öffnen der Datei zum Schreiben manchmal sehr lange dauert, manchmal sogar bis zu 2-3 Sekunden. Ich bin unter der Annahme dass dies passiert, weil es durch Lesen (oder durch etwas) gesperrt ist, aber ich habe keine schlüssige Möglichkeit zu beweisen, dass PHP, so wie ich es aus der Dokumentation verstehe, nichts sperren sollte. Das passiert alle 2-5 Minuten, also ziemlich häufig.

Im Code mache ich nichtirgendei Art der Sperre, und es ist mir ziemlich egal, ob die Informationen dieser Datei beschädigt werden, wenn ein Lesevorgang fehlschlägt oder wenn sich Daten während eines Lesevorgangs ändern. Es ist mir jedoch egal, ob das Schreiben im Wesentlichen 2 Sekunden dauert, da der Prozess, der dreimal pro Sekunde ausgeführt werden muss, jetzt mehrere Schläge übersprungen hat.

Ich schreibe die Datei mit diesem Code:

$handle = fopen(DIR_PUBLIC . 'filename.txt', "w");
fwrite($handle, $data);
fclose($handle);

Und ich lese es direkt mit:

file_get_contents('filename.txt')

(Es wird nicht direkt als statische Datei an die Clients gesendet. Ich erhalte eine reguläre PHP-Anfrage, die die Datei liest und einige grundlegende Dinge damit macht.)

Die Datei ist ungefähr 11 KB groß, sodass das Lesen / Schreiben nicht viel Zeit in Anspruch nimmt. Gut unter 1ms.

Dies ist ein typischer Protokolleintrag, wenn das Problem auftritt:

  Open File:    2657.27 ms
  Write:    0.05984 ms
  Close:    0.03886 ms

Nicht sicher, ob es relevant ist, aber die Lesevorgänge finden in regulären Web-Anfragen über Apache statt, aber das Schreiben ist eine reguläre "Kommandozeilen" -PHP-Ausführung, die von Linux's Cron ausgeführt wird. Es geht nicht über Apache.

Haben Sie eine Idee, was diese große Verzögerung beim Öffnen der Datei verursachen könnte?
Haben Sie einen Hinweis darauf, wo ich nachsehen kann, um die tatsächliche Ursache zu ermitteln?

Alternativ können Sie mir etwas einfallen lassen, das ich tun könnte, um dies zu vermeiden? Zum Beispiel würde ich gerne eine Zeitüberschreitung von 50 ms für das Öffnen festlegen können. Wenn die Datei nicht geöffnet wurde, wird sie einfach übersprungen und der nächste Lauf des Cron erledigt dies.

Again, meine Priorität ist es, den Cron dreimal zu schlagen, alles andere ist zweitrangig, also sind Ideen, Vorschläge und alles äußerst willkommen.

Vielen Dank
Daniel

Antworten auf die Frage(4)

Ihre Antwort auf die Frage