TS: Wert eines Reglers an eine Datei weitergeben

Beitrag lesen

Hello,

Hast Du an das Locking und das Flushen gedacht?

Hast du nicht hier:

wenn du mit einem "normalen" Responder (also php-Script) arbeitest, musst Du leider DieDatei doch jedes Mal erneut öffnen.

gesagt, dass das nicht funktioniert?

Das sind zwei verfschiedene Schuhe. Locking benötigst Du eigentlich immer, wenn mehrere Prozesse zeitgleich auf dieselben Daten zugreifen können sollen und mindestens einer davon auch schreiben darf.

das fflush() sollte eigentlich automatisch beim Schließen mit fclose() passieren, genauso, wie das flock(LOCK_UN). Leider hatten die PHP-Entwickler da zwischendurch mal einen Knoten im Kopf. Ich weiß nun den aktuellen Stand nicht.

Wenn Du die Synchronisation zwischen schreibendem und lesenden Prozess nicht aufs Spiel setzen willst, darfst Du die Datei auch nicht jedes Mal neu erzeugen, sondern musst von beiden Prozessen auf eine bestehende Datei zugreifen. Deshalb benötigt Du in beiden Prozessen eine gemeinsame Locking-Methode. PHP verwendet von Haus aus "Advisory Locking". Wenn auch nur ein einziger beteiligter Prozess dies nicht einhält, ist die Strategie kaputt.

Und nach dem Schreiben der Daten muss die Datei auf die geschriebene Länge gekürzt werden fruncate(), solange sie noch gesperrt ist.

Du solltest also zum Beschreiben benutzen, wenn nur ein Datenwert in der Datei stehen soll:

$fp = fopen('dateiname', 'rb+');
flock ($fp, LOCK_EX);
fwrite($fp, $data);
# fflush($fp);   ### sollte eigentlich überflüssig sein
ftruncate($fp, strlen($data));
# flock($fp, LOCK_UN);   ### sollte eigentlich überflüssig sein
fclose($fp);

Und im lesenden Prozess:

$fp = fopen('dateiname', 'rb');

Datei kann offen bleiben

while ($auswerten)
{
    flock ($fp, LOCK_SH);
    fseek ($fp, 0);
    $data = fread($fp);
    flock ($fp, LOCK_UN);

## hier Daten auswerten lassen
    
   sleep(1);
}

fclose($fp);

Die Fehlerbehandlungen habe ich jetzt noch weggelassen. Die gehören aber in jedes produktive Script!

Liebe Grüße
Tom S.

--
Es gibt nichts Gutes, außer man tut es
Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.