Server-Config beeinflusst Hash von Dateiinhalten?
Mastershrimp
- webserver
0 Beat0 Mastershrimp0 Beat0 Mastershrimp0 Sven Rautenberg0 Beat
0 hotti
Heyho!
Um den Dateiinhalt zu verifizieren (z.B. hinsichtlich FPT-Übertragungsfehler) vergleiche ich die MD5-Hash-Werte der Dateien meines CMS mittels PHPs md5_file()-Funktion.
Es gibt 3 Umgebungen:
* Lokal (Win7, XAMPP, PHP 5.2.9)
* Server 1 (Debian Linux, Apache, PHP 5.2.8)
* Server 2 (Debian Linux, Apache, PHP 5.2.13)
Wichtig: Server 1 und 2 liegen bei _verschiedenen_ Anbietern! Sind also höchstwahrscheinlich anders konfiguriert.
Wenn ich die Hashes meines lokalen Systems mit denen von Server 1 vergleiche meldet das Script, dass alle Dateien identisch sind. Wenn ich die Hashes meines lokalen Systems mit denen von Server 2 allerdings vergleiche, haben ca 500 von 1500 Dateien einen anderen Hash.
Woran kann das liegen? Wohl nicht an Windows/Linux-Komplikationen, denn sonst würde es auf Server 1 ja auch nicht funktionieren - oder?
Was ich bis jetzt festgestellt habe:
* Es sind nur Textdateien betroffen (.php, .js, .css, .tpl), keine Binärdateien (wie z.B. Bilder)
* Es sind sowohl Dateien betroffen die ich erstellt habe, als auch die von Drittanbietern. Wohlbemerkt aber nicht alle Textdateien - wie gesagt, nur ca. ein Drittel.
Bei der Analyse einer der 500 Dateien dachte ich zuerst es läge an Umlauten. Aber als ich eine Datei mal soweit gekürzt habe dass sie nur noch "<div id=...>
</div" (in neuer Zeile!) enthielt, war der Hash weiterhin unterschiedlich. Beim Entfernen des Zeilenumbruchs wurden die Hashs identisch.
Was ich mich jetzt frage:
Liegt es also an den Newlines?
Warum nicht in allen (Text-)Dateien?
Warum nicht auf beiden Servern?
Gibt es eine Einstellung von PHP/Apache die die Behandlung von Newlines beeinflusst?
Warum spielt das überhaupt eine Rolle wenn md5_file() doch binary safe ist? Ich habe es auch nochmal manuell mit fread() und md5($filecontent) geprüft - es macht keinen Unterschied.
Hat jemand eine Idee? Würde mir sehr weiterhelfen!
Vielen Dank schonmal und viele Grüße
Mastershrimp
Liegt es also an den Newlines?
offensichtlich
Warum nicht in allen (Text-)Dateien?
Weil einige Textdateien auf deinem lokalen System bereits die für UNIX konforme newlines enthalten.
Warum nicht auf beiden Servern?
Deine Frage hat nicht genügend Daten, um darauf einzugehen.
Gibt es eine Einstellung von PHP/Apache die die Behandlung von Newlines beeinflusst?
Deine Textfiles geraten über mehrere Wege auf die fernen Server.
Bei FTP werden bei Textmodus Übertragung Newlines nach network konvertiert.
Dort ist eine Newline als "\015\012" definiert.
Files, die du auf den Servern selbst erstellst sind davon nicht betroffen.
Warum spielt das überhaupt eine Rolle wenn md5_file() doch binary safe ist?
Und was heisst binarysafe? Textfiles sind offensichtlich keine binaries.
Wenn du Textfiles absolut identisch auf den Servern haben willst, musst du sie auch als binary übertragen, also die Standardübetragungseinstellungen der FTP-Programme anpassen.
Ich habe es auch nochmal manuell mit fread() und md5($filecontent) geprüft - es macht keinen Unterschied.
Weil PHP Fakten behandelt, die bereits geschaffen sind.
mfg Beat
Heyho!
Vielen Dank! Genau das wars! Puh, ok, darauf muss man erstmal kommen ;) Hatte den Fehler bei PHP vermutet.
Was spricht dagegen sämtliche Dateien binary zu übertragen? Es scheint momentan alles zu funktionieren...Die Windows-Newlines scheinen also keinen Stress zu machen?
Viele Grüße
Mastershrimp
Was spricht dagegen sämtliche Dateien binary zu übertragen?
Performance.
Die Konvertierung der Newlines bei Textfiles ist ja in der Regel durchaus erwünscht.
Es scheint momentan alles zu funktionieren...Die Windows-Newlines scheinen also keinen Stress zu machen?
Das kommt darauf an, welche Stelle sie in den Files einnehmen.
handelt es sich um ein Script, das Network-Output generiert (z.B. http Header oder Mail Header), indem du hardkodierte statt encodete Newlines verwendest, dann spielt es in der Tat eine Rolle.
mfg Beat
Was spricht dagegen sämtliche Dateien binary zu übertragen?
Performance.
Wieso ist denn eine binär-Übertragung langsamer?
Das kommt darauf an, welche Stelle sie in den Files einnehmen.
handelt es sich um ein Script, das Network-Output generiert (z.B. http Header oder Mail Header), indem du hardkodierte statt encodete Newlines verwendest, dann spielt es in der Tat eine Rolle.
Mhhh muss ich mal beobachten. Streng genommen hab ich da aber glaub ich immer eincodete Newlines verwendet...
Vielen Dank nochmal für deine schnelle Hilfe!
Moin!
Was spricht dagegen sämtliche Dateien binary zu übertragen?
Performance.
Wieso ist denn eine binär-Übertragung langsamer?
Kann ich auch nicht nachvollziehen, wieso als Gegenargument da "Performance" kommt.
FTP ist ein sehr altes Protokoll. Wie man offensichtlich erkennen kann, gab es wohl mal den Bedarf, Textdateien noch während des Transfers hinsichtlich der Zeilenenden zu transformieren.
Den Bedarf könnte es heute noch geben, sofern Editoren auf den jeweiligen Systemen mit nix anderem klarkommen würden. Zum Glück ist das nicht mehr so. Einfach überall Unix-Zeilenenden verwenden und binär übertragen - funktioniert prima.
Und bitte nicht verwirren lassen: PHP behandeln "\n" durchgehend als Zeilenende für Unix - auch unter Windows. "\n" steht für den ASCII-Code 10 (0x0A). Eventuelle magische Umwandlungen in Windows-Zeilenschaltungen finden nicht statt.
- Sven Rautenberg
Was spricht dagegen sämtliche Dateien binary zu übertragen?
Performance.
Wieso ist denn eine binär-Übertragung langsamer?
Kann ich auch nicht nachvollziehen, wieso als Gegenargument da "Performance" kommt.
Wahrscheinlich mein Irrtum auf Grund der Beobachtung das Binär-Dateien langsamer übertragen werden, als Textdateien, ohne die Art des Inhalts und dessen komprimierbarkeit zu berücksichtigen.
mfg Beat
hi,
Was spricht dagegen sämtliche Dateien binary zu übertragen?
Gar nichts, ich mache das nur so und empfehle das auch.
Die Windows-Newlines scheinen also keinen Stress zu machen?
Doch, das machen die auf Unix-Systemen!!! Von daher genau andersrum: Verwende Textdateien mit Unix-Zeilenumbrüchen auf Windows, das funktioniert. Dann klappts auch mit dem binary-Transfer und die Dateien sind absolut gleich, auch die Checksumme mit md5.
Hotti