2015-12-21 5 views
7

Ich muss eine Sperrdatei erstellen, die nicht von anderen Skripten oder Prozessen gelöscht werden kann. Ich versuchte dies:So sperren Sie eine Datei gegen externe Prozesse

$f = fopen($pidFile, 'w'); 
    fwrite($f, getmypid()); 
    flock($f, LOCK_EX); 

aber andere Verfahren aus dem aktuellen Benutzer gestartet kann die $f Datei, selbst wenn die Datei-Handle löschen noch durch das laufende Skript geöffnet wird. Wie man dieses Problem löst und andere (d. H. Nicht-PHP-Prozesse zu) daran hindert, die Datei zu löschen? Und die Sperre wird automatisch freigegeben, wenn der Prozess beendet wird? Alle ähnlichen Fragen enden mit einer RTM flock(), aber keine von ihnen beantwortet, wie eine Datei gegen externe Prozesse gesperrt wird.

OS ist Linux 2.6.32-431.el6.x86_64

+2

'flock' ist" beratend ", nicht streng. Verwenden Sie [zusätzliche Prüfung] (http://stackoverflow.com/questions/20771824/php-test-if-file-islocked), bevor Sie etwas mit der Datei in Ihren Skripten machen. Dies funktioniert, wenn es um eigene PHP-Skripte geht. Wenn es um externe Prozesse geht, kann 'flock' den Fall nicht retten. –

+1

Wie ich in meiner Frage erwähnt habe, muss ich die Datei sperren, um das Löschen von externen Prozessen zu verhindern (d. H. Auch Nicht-PHP) –

Antwort

5

flock auf Linux „Beratungs locking“ verwendet standardmäßig, das heißt, es keine andere Prozesse nicht daran hindert, aus dieser Datei zu manipulieren. Siehe den Hinweis im PHP-Handbuch.

flock() verwendet obligatorische Sperren anstelle von Advisory-Sperren unter Windows. Obligatorisches Sperren wird auch auf Linux- und System V-basierten Betriebssystemen über den üblichen Mechanismus unterstützt, der vom Systemaufruf fcntl() unterstützt wird: Das heißt, wenn für die fragliche Datei das Setgid-Berechtigungsbit gesetzt und das Gruppenausführungsbit gelöscht ist. Unter Linux muss das Dateisystem auch mit der Option mand gemountet werden, damit dies funktioniert.

Siehe auch https://www.kernel.org/doc/Documentation/filesystems/mandatory-locking.txt

Eine Datei als Kandidat für die obligatorischen Verriegelungs gekennzeichnet ist durch die Gruppen-ID-Bit in dem Dateimodus einstellen, aber das Gruppe-Execute-Bit zu entfernen. Dies ist eine ansonsten bedeutungslose Kombination, und wurde von den System V-Implementierern so gewählt, dass sie nicht existierende Benutzerprogramme brechen.

Beachten Sie, dass das Gruppen-ID-Bit normalerweise automatisch vom Kernel gelöscht wird, wenn eine Setgid-Datei geschrieben wird. Dies ist eine Sicherheitsmaßnahme. Der Kernel wurde geändert, um den Spezialfall eines obligatorischen Sperrkandidaten zu erkennen und davon abzuhalten, dieses Bit zu löschen. In ähnlicher Weise wurde der Kernel modifiziert, nicht , um obligatorische Lock-Kandidaten mit Setgid-Privilegien auszuführen.

dagegen auch die Warnung:

Nicht einmal root eine obligatorische Sperre außer Kraft setzen kann, so außer Kontrolle geratene Prozess kann verheerenden Schaden anrichten, wenn sie wichtige Dateien sperren. Der Weg ist es, die Datei Berechtigungen zu ändern (entfernen Sie das Setgid-Bit), bevor Sie versuchen, es zu lesen oder zu schreiben.

+1

Vielen Dank für die Erklärung. Aber wie implementiert man das in PHP, um mein Problem zu lösen? –

+0

@AlexanderPravdin versuchen https://books.google.de/books?id = mCpnlNYzqOQC & lpg = PA247 & ots = qAWSgskqZ6 & dq = verpflichtend% 20file% 20locking% 20php & hl = de & pg = PA246 # v = einseitige & q = verpflichtend% 20file% 20locking% 20php & f = falsch – Gordon

+0

Danke, aber die Funktion flock() sperrt Dateien nicht gegen externe Prozesse (wie ich sehen kann, was in diesem Buch erklärt wird). Aber Seiten von 249 und weiteren sind versteckt und erfordern, das Buch zu kaufen. –