hawkmaster: Programmierfehler? Seltsames Problem mit readdir()

Hallo zusammen,
Folgende Ausgangssituation:
in einem Verzeichnis "view" auf Windows XP, liegen 10 JPG Dateien. (file1.jpg, file2.jpg...)
Mit einem PHP Script lese ich das Verzeichnis aus und erstelle Thumbnails.
Mit diesem Script (Auszug) funktionierte diese bisher problemlos:
----------------------------------------------------------
$verz=opendir ($userview);
while ($bild = readdir ($verz)) {
 if($bild != "." && $bild != ".."){
 $id = split("[.]",$bild);
 if ($id[1] == "jpg" or $id[1] == "gif") {
  $newfilename= "k_".$bild;
  $size=getimagesize($userview."\".$bild);
  $breite=$size[0];
  $hoehe=$size[1];
  $neueHoehe=intval($hoehe*$neueBreite/$breite);
  if($size[2]==2){
  $altesBild=ImageCreateFromJPEG($userview."\".$bild);
  $neuesBild=ImageCreate($neueBreite,
  $neueHoehe);
  ImageCopyResized($neuesBild,
  $altesBild,
  0,
  0,
  0,
  0,
  $neueBreite,
  $neueHoehe,
  $breite,
  $hoehe);
  ImageJPEG($neuesBild,
  $userview."\".$newfilename);
  $file_counter++;
  }
 }

}
 } //while
---------------------
Ich öffne also das Verzeichnis "$userview", gebe der verkleinerten Datei den Zusatz "k_" und erzeuge die kleine JPG mit "$altesBild=ImageCreateFromJPEG(.."

Jetzt liegen neben den 10 großen original JPG Dateien auch 10 kleine die alle mit "k_" anfangen, also "k_file1.jpg,k_file2.jpg...)

Zum eigentlichen Problem;
Bisher hatte ich damit nie Probleme, auf keinem PC und immer mit dem gleichen Script.
Gestern erlebte ich zum ersten mal die Situation, das praktisch eine Art endlos Schleife entstand
Ich hatte nachher im Verzeichnis $useview mehrere 100 Dateien . Es sah dann so aus
k_file1.jpg
k_k_file1.jpg
k_k_k_file1.jpg
k_k_k_k_file1.jpg
usw.

Wenn ich mir das Script nun bewußter anschaue, muss das ja eigentlich auch passieren, da ja in dem gleichen Verzeichnis während dem lesen mit readdir() gleich wieder neue Dateien erstellt werden.

Die entscheidene Frage:
Wenn es aber ein Programmierfehler ist, warum funktioniert das Script so wie es ist aber nahezu überall?
Kann es irgendwie mit der Festplattengeschwindigkeit zusammenhängen?

vielen Dank und viele Grüße
hawk

  1. Moin!

    Die entscheidene Frage:
    Wenn es aber ein Programmierfehler ist, warum funktioniert das Script so wie es ist aber nahezu überall?
    Kann es irgendwie mit der Festplattengeschwindigkeit zusammenhängen?

    Nein, es hängt (vermutlich - genau beweisen kann ich es nicht) mit der Directorystruktur zusammen.

    Dein Skript öffnet das Verzeichnis, liest einen Dateinamen aus und generiert ein neues Bild.

    Mit Pech erzeugt dieser Vorgang einen neuen Dateinamen, der sich genau _hinter_ den gerade ausgelesenen Dateinamen setzt, und dann als nächstes ausgelesen wird. So kommt es zur Endlosschleife.

    Mit Glück passiert das nicht, d.h. das neue Thumbnail wird entweder weit danach oder auch vor den derzeitigen Verzeichniseintrag gesetzt. Sobald in einem Verzeichnis Dateien gelöscht sind, werden in der fortlaufenden Liste ja Plätze frei, die wieder neu genutzt werden können.

    Dein Skript verstößt halt ganz einfach gegen eine elementare Grundregel, indem es die Liste (ein Verzeichnis kann man betrachten als eine Textdatei mit einer Liste von Dateien darin), mit der es arbeitet, währenddessen verändert. Und zwar dummerweise an Stellen, die du nicht vorhersehen kannst, weil du den Zustand des Verzeichnisses, insbesondere von Listenlücken, nicht kennst.

    Deshalb arbeiten übliche Thumbnailskripte entweder so, dass sie zuerst die gesamte Dateiliste einlesen, und erst dann generieren, oder dass sie die Thumbnails in ein anderes Verzeichnis speichern (was den Vorteil hätte, dass ein zweiter Skriptlauf keine Thumbnails der Thumbnails erzeugt).

    Wenn du von der Endlosschleife wegkommen willst, könntest du natürlich auch einfach prüfen, ob der gerade gelesene Dateiname das Thumbnail-Prefix (oder -Suffix) enthält, und in diesem Fall die Datei überspringen. Das würde die Endlosschleife unterbrechen und außerdem verhindern, dass auch bei mehreren Durchläufen Thumbnails von Thumbnails erzeugt werden.

    - Sven Rautenberg

    --
    "Love your nation - respect the others."
    1. Hi Sven
      erst mal herzlichen Dank für deine ausführliche Hilfe und Beschreibung.
      Jetzt im Nachhinein und bei genauer Betrachtung ist es mir klar, dass es fehlerhaft war was ich da gemacht hatte. Mir ist es nur nie aufgefallen, weil es nirgends Probleme gab, obwohl das Script schon auf vielen PCs lief. (nicht im Internet).
      Mir fällt gerade ein, dass der PC auf dem es Probleme gab, unter XP Prof mit FAT32 lief.
      Bisher hatte ich glaub immer mit NTFS getestet?
      Kann es vermutlich der Grund sein?

      Ich habe es jetzt dahingehend geändert, dass ich die Thumbs "k_file1,jpg" in einem neuen Unterordner erstelle und von dort aus anzeige.

      Nochmals herzlichen Dank
      Gruss
      hawk

      1. Hallo

        Mir fällt gerade ein, dass der PC auf dem es Probleme gab, unter XP Prof mit FAT32 lief.
        Bisher hatte ich glaub immer mit NTFS getestet?
        Kann es vermutlich der Grund sein?

        Die Art (der Typ) des Dateisystems sollte keinen Einfluss haben.

        *btw* Die Fat32-Partition deines XP-Prof-Systems war doch hoffentlich nur eine Datenpartition und nicht die des Systems ansich?

        Tschö, Auge

        --
        Die Musik drückt aus, was nicht gesagt werden kann und worüber es unmöglich ist zu schweigen.
        (Victor Hugo)
        <dingdong /><dingdong /><toc /><toc /><toc /><shout>Florence!</shout>
        Veranstaltungsdatenbank Vdb 0.1
        1. Hallo,

          Die Art (der Typ) des Dateisystems sollte keinen Einfluss haben.

          Gegenfrage: was kann es denn dann noch sein? Der PC war relativ neu, also nicht langsam.

          *btw* Die Fat32-Partition deines XP-Prof-Systems war doch hoffentlich nur eine Datenpartition und nicht die des Systems ansich?

          Ja es war nur eine Daten Partition und es war auch nicht mein PC. Zudem war es eine reine Testumgebung.

          Gruss
          hawk

          1. Hallo

            Die Art (der Typ) des Dateisystems sollte keinen Einfluss haben.

            Gegenfrage: was kann es denn dann noch sein?

            Programmierfehler?!

            Tschö, Auge

            --
            Die Musik drückt aus, was nicht gesagt werden kann und worüber es unmöglich ist zu schweigen.
            (Victor Hugo)
            <dingdong /><dingdong /><toc /><toc /><toc /><shout>Florence!</shout>
            Veranstaltungsdatenbank Vdb 0.1
            1. Hallo

              Gegenfrage: was kann es denn dann noch sein?

              Programmierfehler?!

              Nachtrag:

              Du erledigst alle Aufgaben des Skripts innerhalb der Schleife, mit der du das Verzeichnis ausliest. Das lässt Svens Argumentation als zutreffend dastehen.

              Teile eine Aufgabe in einzelne Unteraufgaben auf. Hier wären das das Auslesen des Verzeichnis', die Generierung der Daumennägel ;-) und das Schreiben derselben. Die letzten beiden Aufgaben würde ich, schon wegen eventueller Speicherlimitierungen, je Bild zusammenfassen.

              Die erste jedoch, die kann man, ohne zusammenhänge aus den Augen zu verlieren, einzeln ausführen. Verzeichnis öffnen, Dateinamen auslesen und in ein Array schreiben, Verzeichnis(handle) schließen. Schon erledigt sich dein Problem, außer im Falle eines erneuten Durchlaufs (deshalb ja auch: Thumbnails in ein anderes Verzeichnis).

              Tschö, Auge

              --
              Die Musik drückt aus, was nicht gesagt werden kann und worüber es unmöglich ist zu schweigen.
              (Victor Hugo)
              <dingdong /><dingdong /><toc /><toc /><toc /><shout>Florence!</shout>
              Veranstaltungsdatenbank Vdb 0.1