Rolf B: Dateien in php umbenennen

Beitrag lesen

Hallo Voku Hila,

ich habe deine „Lösung“ mit -1 markiert, weil sie das Problem mit Brachialgewalt erschlägt, nach dem Motto: Irgendwas wird schon helfen.

Grundproblem ist: uniqid() basiert intern auf dem aktuellen microtime() Wert. Ein schnell laufendes Programm auf einem schnellen Server ist durchaus im Stande, in einer einzigen Mikrosekunde diese Funktion mehrfach aufzurufen - trotz Dateioperationen (die werden vom Betriebssystem ohnehin im Cache ausgeführt).

Ich habe keinen Überblick über die Codeentwicklung von PHP, es gibt aber Versionen von uniqid die usleep() aufrufen, und damit bis zu 10ms Verzögerung produzieren, andere machen einen active wait, bis sich der microtime-Wert seit dem letzten Aufruf ändert, und es gibt auch welche, die machen gar nichts und können damit tatsächlich gleiche Werte produzieren.

Deswegen gibt es die beiden Ergänzungsparameter. Der erste dient dazu, bei parallel laufenden Systemen (Thread, Prozess, Maschine) der uniqid ein Präfix voranzustellen, das den Parallelzweig identifiziert und damit verhindert, dass zwei parallele Zweige die gleiche ID produzieren. Der zweite generiert eine Zufallszahl und hängt sie an die erzeugte ID an.

Dein Code produziert per Mersenne-Twister eine Zufallszahl als Präfix, dann kommt der microtime-basierende uniqid-Wert und schließlich eine weitere Zufallszahl, diesmal per doppeltem Kongruenzgenerator.

Das jagst du dann durch md5() - vermutlich um schön gleich lange Dateinamen zu bekommen. In zwei Monaten versteht das kein Mensch mehr.

Statt dieses Aufwandes kannst Du Dir einmal per microtime(true) die aktuelle Zeit holen, diesen Wert speichern, pro rename um 1 hochzählen und dem md5 Hash des Zählerstandes bestimmen. Oder einfach einen int-Zähler hochdrehen, die Zahl in einen String umwandeln und den als Dateiname nutzen. Der Zähler muss natürlich global sein, sonst klappt die Rekursion nicht.

Rolf

--
sumpsi - posui - clusi