2 Stimmen

Sicheres gleichzeitiges Schreiben in eine Datei, die von einem Perl- und einem PHP-Skript gemeinsam genutzt wird

Ein Perl-Skript (das ich nicht kontrolliere) fügt in regelmäßigen Abständen Zeilen an das Ende einer Textdatei an.

Mein PHP-Skript (das als Cron-Job ausgeführt wird) muss die Zeilen aus dieser Datei lesen, sie verarbeiten und dann aus der Datei entfernen. Die einzige Möglichkeit, mit PHP eine Zeile aus einer Datei zu entfernen, besteht darin, die Datei in eine Variable einzulesen, die eine Zeile zu entfernen, die Datei abzuschneiden und sie dann neu zu schreiben.

Aber was passiert, wenn:

  1. PHP liest die Datei
  2. Das Perl-Skript fügt eine neue Zeile an.
  3. Das PHP-Skript schreibt den geänderten Puffer zurück in die Datei.

In diesem Fall würde die neue Zeile verloren gehen, da sie überschrieben würde, wenn das PHP-Skript die Datei beendet und aktualisiert.

Gibt es eine Möglichkeit, eine Datei mit PHP so zu sperren, dass sie von Perl respektiert wird? Es sieht so aus, als ob die Funktion flock() PHP-spezifisch ist.

3voto

djna Punkte 53789

Haben Sie die Möglichkeit, das Design zu ändern? Ist das Entfernen der bearbeiteten Zeilen aus der Datei ein wesentlicher Bestandteil Ihrer Bearbeitung?

Wenn Sie diese Freiheit haben, wie wäre es, die von Perl erzeugte Datei wachsen zu lassen? Vermutlich haben die Autoren des Perl-Skripts bereits eine Art von Housekeeping im Sinn? Führen Sie Ihr eigenes "Protokoll" darüber, was Sie verarbeitet haben. Wenn Ihr Skript dann startet, liest es die Perl-Datei bis zu dem Punkt, der in Ihrem "Log" aufgezeichnet ist. Verarbeiten Sie einen Datensatz, aktualisieren Sie das Protokoll.

1voto

innaM Punkte 46916

Wenn das Perl-Skript, das Sie nicht kontrollieren können, bereits eine Dateisperre über flock implementiert, ist alles in Ordnung. Wenn es das nicht tut (und ich fürchte, davon müssen wir ausgehen), haben Sie Pech gehabt.

1voto

hlovdal Punkte 24350

Eine andere Möglichkeit wäre, das Perl-Skript nicht in eine Datei schreiben zu lassen, sondern in eine benanntes Rohr und lassen Sie Ihr PHP-Skript direkt am anderen Ende auslesen und in eine echte Datei schreiben.

0voto

hlovdal Punkte 24350

Vielleicht können Sie Ihr PHP-Skript statt mit derselben Datei mit einer Kopie arbeiten lassen? Ich könnte mir vorstellen, dass es mit drei Dateien funktionieren könnte:

  1. Datei, in die das Perl-Skript schreibt
  2. Eine Kopie von Akte 1
  3. Eine bearbeitete Version von Datei 2

Wenn Ihr PHP-Skript dann startet, prüft es, ob Datei 1 neuer ist als Datei 2, und wenn ja, erstellt es eine neue Kopie, verarbeitet diese (und überspringt dabei möglicherweise die Anzahl der bereits verarbeiteten Zeilen) und schreibt sie in Datei 3.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X