2010-07-21 10 views
7

Ich habe eine Frage darüber, wie PHP Dateisystemoperationen behandelt. Ich verwende diesen Code, der davon abhängt, dass eine Datei erstellt wird, bevor sie verwendet wird, und es fühlt sich an, als ob ich den Code ausführen würde - manchmal funktioniert es, die Datei wird erstellt und der PHP-Code verwendet sie, manchmal auch schlägt fehl.Wartet PHP darauf, dass Dateisystemoperationen (wie file_put_contents) abgeschlossen werden, bevor es weitergeht?

Also ich frage mich, wie php Dateisystemoperationen behandelt, sendet es im Hintergrund oder wartet es bis der Vorgang abgeschlossen ist?

+2

"Blockieren" ist der Begriff, an dem Sie interessiert sind. Blockiervorgänge führen dazu, dass Ihr Programm wartet (oder "blockiert"), bis sie abgeschlossen sind. Nicht-blockierende oder asynchrone Operationen sind solche, die 'in den Hintergrund' geschickt werden :) – meagar

Antwort

6

Ja, wenn Sie eine Datei-Handle öffnen und legen Sie es dann nicht blockierenden Modus: stream_set_blocking()

+2

Das ist eigentlich nicht wahr. Wenn Sie öffnen und einfach (f) schreiben, werden die Daten nicht auf die Festplatte geschrieben. Wenn fwrite die C-Funktion fwrite verwendet, haben die Daten mit hoher Wahrscheinlichkeit nicht einmal das Betriebssystem erreicht. Wie @Matthew Flaschen herausfand, werden die Daten nur während des Schließens und Fließens auf die Festplatte geschrieben. – dmeister

+0

@ircmaxell, Antwort braucht Ausarbeitung. – Pacerier

3

PHP sollte warten, bis der Prozess abgeschlossen ist. Aber nicht zu wissen, wie Sie die Operationen implementieren, ist schwer zu sagen. Wenn Sie einen Beispielcode posten können, den Sie verwenden, wäre das hilfreich, damit wir Ihnen helfen können, herauszufinden, warum es nicht richtig funktioniert.

+0

sollte, scheint aber nicht wahr. Ich hatte gerade Problem, wo Dateien noch nicht vollständig geschrieben scheint, bevor ein anderer Satz von Code ausgeführt wird, um sie zu verarbeiten, was seltsames Problem verursachte –

8

file_put_contents entspricht fopen, fwrite, fclose. fclose sollte sicherstellen, dass die Datei vollständig auf die Festplatte geladen wird.

+3

Die einzige Möglichkeit, um sicher zu sein, dass die Datei vollständig auf die Festplatte ausgeleert wird, ist das Deaktivieren des Write-through-Caching auf den Laufwerken. Ansonsten können Sie nur feststellen, dass das Dateisystem die Schreibbefehle ausgegeben hat, nicht dass der Schreibvorgang tatsächlich erfolgreich auf die Festplatte übertragen wurde ... – ircmaxell

+0

Hebt das 'LOCK_EX'-Flag das auf? http://php.net/manual/en/function.file-put-contents.php – martin

2

Jahr 2013, auf meinem gemeinsamen Garten Vielfalt Linux vps mit cpanel, mit Standardeinstellungen, mit php 5.2.17, file_put_contents dauert immer ~ 5ms für kurze String-Längen.

Versehentlich 5ms ist über die volle festgeschriebene Schreibzeit einer hochwertigen Festplatte.

file_put_contents($filename,'abcdefghi...~100chars',FILE_APPEND); 

Dies dauert ~ 5ms konsistent. Das scheint Blockieren und Spülen zu beinhalten. Also für diejenigen fragen, über die Geschwindigkeit von file_put_contents, mindestens 5 ms/Betrieb auf gemeinsamen Server 2013 04.

Wenn Sie Geschwindigkeit benötigen, beispielsweise für einige Protokollierung, sagte @Matthew Flaschen:

file_put_contents is equivalent to fopen, fwrite, fclose. 
fclose should ensure the file is fully flushed to disk. 

Dann braucht man :

Aber es wird einige Nachforschung brauchen, um herauszufinden, was passiert, wenn Dateigriffe offen bleiben. Php closes them at exit, aber tut es das wirklich die ganze Zeit? Selbst wenn es abstürzt? Was passiert wenn eine Datei nach einem Absturz von PHP offen gelassen wird? usw. usw. Nach 30 Minuten php manuellen Lesens und Googelns wurden solche und ihre Konsequenzen nicht erwähnt.

Verwandte Themen