Hi,
aktuell ist die heutige Lösung. Ich entwickle gerade ein Aktualisierungs-System in Form einer Web-Oberfläche. Das ganze drumherum sieht folgendermaßen aus:
Der "Kunde" (ich nenne es mal so) hat ein von mir entwickeltes System, das irgendwas spezielles tut. Ich baue derzeit nun also eine Möglichkeit ein, Updates durchzuführen. Das läuft so, dass sich die Update-Funktion die ganzen Dateien von meinem Server holt und die Dateien auf dem Server des "Kunden" mit den neuen von meinem Server ersetzt. Das Problem welches dabei aufgetreten ist, war nun: "Wie stelle ich am besten fest ob sich eine Datei auf meinem Server geändert hat? Ich ersetze ja nicht nach Lust und Laune gleich alle .php und sonstige Dateien, ich möchte vorher schon ermitteln, ob sich an der Datei auf meinem Server was geändert hat. Ein Vergleich über das Änderungsdatum gefällt mir persönlich nicht und ist mir zu unsicher. Ein Hash der Datei schlägt ebenso fehl, wenn der Server nicht derselbe ist wie meiner. Bei Windows <-> Linux gibt es Unterschiede bei der Dateigröße und somit auch in der Prüfsumme, da Werte wie CL / RF je nach System anders interpretiert werden. Die folge ist: ein paar Byte mehr oder eben weniger, was eben dazu führt dass die Datei so oder so (also auch wenn sie komplett gleich sind) andere Dateigrößen und dadurch andere Prüfsummen aufweisen können.
Ich suchte also nach einer Möglichkeit, festzustellen ob die Dateien unterschiedlich sind. Denn wenn sie das sind, ist klar, es hat sich auf der Datei die auf meinem Server liegt, was getan, es ist nicht mehr dieselbe wie die, die der Kunde hat. Somit also reif um sie über die Update-Funktion einzuspielen. Wie hab ich jetzt den Unterschied festgestellt? Ich suchte nach einer relativ allgemeinen Lösung, und ich dachte mir nichts könnte Eindeutiger sein als der Inhalt der Dateien. Nur wie wir festgestellt haben klappt das nicht. Meine Überlegung war also, zwar die Dateien auf Größe (Inhalt) zu vergleichen, aber auf die ganzen Sonderzeichen zu verzichten. Angenommen ich speichere also nun den Inhalt einer Datei in einer Variable. Dann entferne ich alles was nicht Wort-Zeichen oder Zahl ist. Zuletzt hol ich mir dann davon die Länge der Zeichenkette. Dies mache ich mit der Datei vom "Kunden" und mit der auf meinem Server.
<pre class="brush:php"><?php $source_diff = strlen(preg_replace("[^dw]", "", @file_get_contents($verzeichnis_quelle . $datei))); $destination_diff = strlen(preg_replace("[^dw]", "", @file_get_contents($verzeichnis_ziel . $datei))); ?></pre>
Kommentare
Kommentar schreiben