J_M_G: Kompliziertes logistisches Problem: Dateien erst da, dann weg...

Hallo liebe Selfer!

Ich habe ein sehr seltsames Problem mit verschwundenen Dateien, und ich komm ihm leider nicht auf die Schliche.

Hintergrund ist Folgender:

  1. bei mir können Leute mittels Ajax Bilder temporär(!) hochladen. Funktioniert ganz prima. Die Bilder landen in einem öffentlich zugänglichen TMP-Verzeichnis und erhalten einen eindeutigen Namen:
  
// find a free file name by generating a random one  
while(true)  
{  
	// using PHP4 !!!  
	$str_baseFileName = uniqid('');  
  
	// look up if a file with that name already exists  
	if (!file_exists('tmpUploads/'.$str_baseFileName.'.jpg'))  
	{  
		break;  
	}  
}
  1. dem User gebe ich sofort den temporären Dateinamen per Ajax zurück, so dass er das Bild anzeigen und sehen kann. Funktioniert ganz prima. Immer!
    (Apaches "CheckSpelling" ist deaktiviert, es ist also exakt die richtige Datei!)

  2. per JavaScript erzeuge ich ein hidden-Feld für den temporären Dateinamen. Also als zusätzliches Formularfeld!

  3. wenn der User zufrieden ist (und eventuell noch mehr Bilder hochgeladen hat), speichert er sein Formular mittels ganz gewöhnlichem HTTP-POST.

[SCHRITTE 1-4 beliebig oft wiederholbar]

  1. mein PHP-Skript nimmt den Dateinamen, holt sich die Datei, und speichert alles Nötige persistent auf der Platte und in der DB ab. Und genau das funktioniert in nur 99% der Fälle: manchmal werden Bilder (die eben noch existiert haben, S. Schritt 2) nämlich nicht gefunden, der User erhält die Mitteilung, dass es sein Bild nicht gibt.
    Und tatsächlich: auf dem Server existiert dieses Bild nicht! Es existiert auch kein Bild, das zurselben Zeit hochgeladen wurde (nur mit anderer ID). Es ist, als wäre das Bild (nachdem ja kurz vorhanden war, S. Schritt 2) einfach verschwunden.
    Eine weitere Anomalie: wenn's passiert, dann passiert es offenbar mit allen neuen Bildern des Formulars! D.h. für 5 Bilder haben Schritt 1-4 viermal geklappt, Schritt 5 scheitert für alle 5 Bilder auf einmal, trotz korrekten IDs.

Von Schritt 1-5 arbeiten wir also permanent mit derselben ID (z.B. "4c48b821f05a2". Und Schritt 1-4 funktionieren ganz prima, in Schritt 5 kommt diese ID auch auf dem Server an (hab ich geloggt).

Mein Verständnis der Technik sagt mir, dass irgendwo in Schritt 5 ein logischer Fehler dafür sorgt, dass das Bild vorzeitig gelöscht oder verschoben wird. Ich konnte aber nichts Derartiges finden!!! Und in 99% geht's ja auch (2000 Bilder pro Tag, ca. 15 Fehlschläge). Rekonstruieren (mit Bildern, die mir User geschickt haben) lässt sich's auch nicht.

Habt ihr irgendeine Idee, ob es Umstände gibt, in denen Unix Dateien nur eine gewisse Lebenszeit zugesteht? Oder irgendwelche anderen Ideen???

Martin

  1. Hallo J_M_G,

    Habt ihr irgendeine Idee, ob es Umstände gibt, in denen Unix Dateien nur eine gewisse Lebenszeit zugesteht? Oder irgendwelche anderen Ideen???

    Zeig uns mehr Code der anderen Teilschritte.

    ciao
    romy

  2. Hi!

    Habt ihr irgendeine Idee, ob es Umstände gibt, in denen Unix Dateien nur eine gewisse Lebenszeit zugesteht? Oder irgendwelche anderen Ideen???

    Bei tmpfile() ist mir ein automatisches Löschen am Scriptende bekannt, aber das scheint ja bei dir nicht zur Anwendung zu kommen, denn deine Dateien leben im Normalfall ja über mehrere Requests hinweg. Ansonsten fällt mir kein typisches Szenario ein, bei dem Dateien verschwinden. Siehst du, wenn du dein Logging mal genauer betrachtest, ob zu fraglichen Zeitpunkten vielleicht Konkurrenzsituationen vorhanden sein können? Wenn sich keine (potentiell) problematische Stelle im Code erkennen lässt, würde ich das Logging verfeinern wollen und jede Menge Einzelheiten festhalten, damit vielleicht ein unvorhergesehenes Userverhalten, Programmablauf oder sonstwas erkannt werden kann.

    Lo!

  3. Hi,

    1. bei mir können Leute mittels Ajax Bilder temporär(!) hochladen. Funktioniert ganz prima. Die Bilder landen in einem öffentlich zugänglichen TMP-Verzeichnis

    *Wie* landen sie da?

    Von Schritt 1-5 arbeiten wir also permanent mit derselben ID (z.B. "4c48b821f05a2".

    Auch wenn Schritt 1-4 beliebig oft zwischendurch wiederholt werden, wie du schriebst?

    Und Schritt 1-4 funktionieren ganz prima, in Schritt 5 kommt diese ID auch auf dem Server an (hab ich geloggt).

    Nur eine ID, obwohl ggf. mehrere Bilder hochgeladen wurden?

    MfG ChrisB

    --
    The most exciting phrase to hear in science, the one that heralds new discoveries, is not “Eureka!” but “That's funny...” [Isaac Asimov]