2012-05-29 7 views
5

Read Nebenläufigkeit der flachen Dateien ist fast unbegrenzt (korrigieren Sie mich, wenn ich falsch liege); aber wie ist die Nebenläufigkeit zum Schreiben? Betrachten wir ein einfaches Zugriffsprotokoll zu schreiben (für Besuche) in PHP als eine Reihe von Zugriffs Detail anhängen endete mit \nWie funktioniert LOCK zum Schreiben von Protokollen in Flatfiles?

fopen(); // in append mode 
fwrite(); 
fclose(); 

Da wir gleichzeitig Besucher haben, wie das System (ein Benutzer, der die wbserver/php Benutzer) Schreiben Sie die Ansichtsprotokolle gleichzeitig?

Meine Verwirrung ist: die Funktion file_put_contents() (die ein Wrapper der oben genannten drei Funktionen ist) hat eine Option zum Sperren (LOCK_EX)? Ist es vorteilhaft, diese Sperroption zu verwenden? Wie wirkt sich das auf das Protokollschreiben aus?

UPDATE: Meine Frage ist, wie LOCK ing ursprünglich funktioniert/betrifft Schreiben von Protokoll in Datei. Ich vergleiche file_put_contents und fwrite nicht; selbst meine Frage ist nicht auf PHP beschränkt. Die Frage betrifft das Sperren einer Datei während des Schreibvorgangs.

+0

'file_put_contents()' hat eine Option zum Sperren, überprüfen Sie die [manuell] (http://php.net/manual/en/function.file-put-contents.php). – yannis

+0

@YannisRizos Wie ich in der ursprünglichen Frage zitiert habe, weiß ich, dass 'file_put_contents'' LOCK_EX' hat. Meine Frage ist, wie sich das auf das Schreiben eines Zugriffsprotokolls auswirkt. – Googlebot

+0

Ja, Sie haben Recht, offensichtlich war mein Kommentar für die zweite Revision der Frage. Schlechte Bearbeitung, diese. – yannis

Antwort

3

file_put_contents() hat eine Option zum Sperren, aber meiner Meinung nach sollten Sie stattdessen flock() verwenden.

Von Handbuch:

Verfügbare Flaggen

FILE_USE_INCLUDE_PATH
Suche nach Dateinamen in dem Verzeichnis enthalten. Weitere Informationen finden Sie unter include_path für Informationen.

FILE_APPEND Wenn der Dateiname bereits vorhanden ist, hängen Sie die Daten an die Datei an, anstatt sie zu überschreiben.

LOCK_EX Erwerben Sie eine exklusive Sperre für die Datei, während Sie mit dem Schreiben fortfahren.

flock() ermöglicht es Ihnen, andere Methoden zu verwenden:

LOCK_SH eine gemeinsame Sperre (Leser) zu erwerben.
LOCK_EX, um eine exklusive Sperre (Writer) zu erwerben.
LOCK_UN, um eine Sperre freizugeben (shared oder exklusiv).

Siehe hier: http://php.net/manual/en/function.flock.php und hier: http://php.net/manual/en/function.file-put-contents.php

0

gewarnt, Datei für Zugriffsprotokolle Sperre ist eine Umgebung, die eine Race-Bedingung leicht vorstellen kann. vielleicht in eine andere Methode schauen? Logging in eine Datenbank, vielleicht? Es ist viel zu einfach für ein gut entwickeltes System zu versuchen, gleichzeitig mit parallelen Prozessen zu öffnen und in das Protokoll zu schreiben.

Vielleicht einen Blick auf Monolog?Es gibt einige Logging-Handler für die asynchrone Protokollierung, die sich ideal für die Zugriffsprotokollierung eignen.

https://github.com/Seldaek/monolog

+0

Wissenswertes über 'Monolog'; Dies ist jedoch ein benutzerdefiniertes Zugriffsprotokoll, nicht das des Systems. Es kann Informationen aus Sitzungen, Cookies, Mitglieder-Login usw. enthalten. Darüber hinaus ist meine Frage allgemein für das Schreiben auf die Festplatte. – Googlebot

+0

@Ali Sie müssen sehr vorsichtig sein, wenn es an etwas gesprächig angeschlossen wird; Je öfter Sie Daten protokollieren, desto höher ist die Wahrscheinlichkeit, dass Ihr Code an das Protokoll angehängt wird, nur um die Dateisperre zu erreichen und nicht protokollieren zu können. In diesem Fall müssen Sie entweder auf etwas auf einer SSD (schnelle Schreibgeschwindigkeit, aber wahrscheinlich nicht als Server-Hardware haben), eine Ramdisk (schnelles Schreiben, aber instabil, verlieren Strom und die Daten sind weg), oder Sie können sich einloggen eine Spinning Disk und drücken Sie die Daumen und hoffen, dass nichts vom Schreiben in das Protokoll gesperrt wird. – damianb