PHP file_getcontents bei langsamen upload

Überkinger

Lieutenant
Registriert
Juli 2010
Beiträge
600
Hallo,

per Crontab lasse ich alle 1 Minute prüfen, ob eine Datei in einem Verzeichnis vorhanden ist.
Wenn vorhanden, dann arbeitet PHP ein Script ab, wenn nicht, Abbruch. Jetzt kann es passieren, dass man von unterwegs aus sehr langsames Internet hat und der Upload des betreffenden Files länger als eine Minute dauern kann. Das Script würde an der Stelle

PHP:
$content_htm = file_get_contents ($quelle_htm);

dann womöglich ein halbfertiges File einlesen und verarbeiten. Das darf auf keinen Fall geschehen. Wie kann man das fachgerecht verhindern? Ich habe mir schon überlegt, das Ende des HTML-Files so aussehen zu lassen

HTML:
</html><!--EOF-->

und das Script anzuweisen, nur dann mit der Ausführung fortzufahren wenn <!--EOF--> in der Datei enthalten ist. Dann wäre gewährleistet, dass der Content immer vorhanden ist. Denke, das ist aber Flickschusterei?
 
Zuletzt bearbeitet:
Du solltest Incron anstatt Cron verwenden. Incron überwacht ein Verzeichnis und führt Befehle bei bestimmten Datei-Ereignissen aus. Bedienung ist ähnlich wie cron:

Zum Bearbeiten:
incrontab -e

Job eintragen:
/path/to/dir IN_CLOSE_WRITE /path/to/script $#

Das überwacht das Verzeichnis /path/to/dir und führt jedes Mal, wenn eine Datei, die zum Schreiben geöffnet war, geschlossen wird, den Befehl /path/to/script aus und übergibt den Dateinamen als Parameter (Platzhalter $#).

Und das Script (bzw. entsprechendes in PHP):
#!/bin/bash
[[ "$1" == "filename" ]] || exit 0 # Nur weitermachen, wenn das Ereignis für die richtige Datei ist.
# ...

Siehe man 5 incrontab.
Zusätzlicher Vorteil ist, dass man nicht bis zu einer Minute warten muss, sondern das Skript sofort nach dem Upload ausgeführt wird. Aufpassen, falls das Skript selbst die Datei auch zum Schreiben öffnet und schließt. ;)
Es wird auch nicht verhindert, dass ein abgebrochener, unvollständiger Upload abgearbeitet wird, d.h. sowas wie ein <!--EOF--> am Ende wäre eventuell trotzdem sinnvoll.
 
Wozu der EOF-Kram, wenn du sowieso "</html>" hast? :p

Trotzdem ist das alles irgendwie frickelig und bewahrt dich je nach Upload-Methode nicht vor sonstigen Fehlern in der Datei.
 
Wenn der Download abbricht wird dir file_get_contents() unter Garantie einen Fehler werfen, also werte diesen doch einfach aus.
 
ice-breaker schrieb:
Wenn der Download abbricht wird dir file_get_contents() unter Garantie einen Fehler werfen, also werte diesen doch einfach aus.

Das ist wahr und einfach in das bestehende Script zu übernehmen.
Ergänzung ()

character schrieb:
Wozu der EOF-Kram, wenn du sowieso "</html>" hast? :p

Trotzdem ist das alles irgendwie frickelig und bewahrt dich je nach Upload-Methode nicht vor sonstigen Fehlern in der Datei.

Stimmt, auch wahr. </html> ist pro Dokument einmalig.
 
ice-breaker schrieb:
Wenn der Download abbricht wird dir file_get_contents() unter Garantie einen Fehler werfen, also werte diesen doch einfach aus.

Eigentlich nicht. Interessiert file_get_contents doch nicht, was für Daten in einer Datei sind, und ob die vollständig sind.
 
file_get_contents() soll aber eine Datei laden, und das bedeutet nicht nur einen Teil der Datei sondern die gesammte Datei.
 
Klar, file_get_contents schaut sich die Datei an, denkt sich "Hey, das ist ja ein HTML-Dokument, das mittendrin aufhört, da liefer ich lieber mal einen Fehler." (: Nein, auf Dateisystem-Ebene ist die Datei vollkommen intakt und wird von file_get_contents klaglos geladen.
 
Http-Request haben auch eine Größe, bricht es mittendrin ab ist es ein Fehler, das hat nichts mit HTML-Dateien zu tun und geht auch mit Textdateien, Bildern usw.
 
HTTP hat nichts mit Dateisystemen zu tun. Sein PHP-Skript laeuft auf der Maschine, auf der auch die Datei hochgeladen wird.

Ob die Datei fehlerhaft ist oder nicht, kann file_get_contents nicht wissen, da das Dateisystem es auch nicht weiß. Das sieht einfach nur eine Datei, die einfach irgendwann aufhört. Ob die Datei komplett und damit semantisch sinnvoll ist, ist dem Dateisystem egal.

Das OS sieht aber, ob die Datei gerade verändert wird. Dementsprechend kann man das Skript abbrechen (bzw. gar nicht erst ausführen). Dieser Fall wird durch incron aber schon abgedeckt.

Das hilft aber nicht gegen Upload-Fehler. Ob und wie zuverlässig der Upload ist, hängt von der Upload-Methode ab, auf die hier noch nicht eingegangen wurde.
 
character schrieb:
Das hilft aber nicht gegen Upload-Fehler. Ob und wie zuverlässig der Upload ist, hängt von der Upload-Methode ab, auf die hier noch nicht eingegangen wurde.

Hallo,

danke für Eure hilfreichen Informationen. Der Upload findet ausschließlich via ftp bzw. sftp statt. file_get_contents liefert wahrscheinlich nur dann ein FALSE zurück, wenn die Datei gar nicht vorhanden ist. Ich werde mir die Lösung mit incron mal ansehen. Bis daher arbeite ich mit Verweilzeiten von einigen Sekunden.
 
Zurück
Oben