*Markus: Überprüfen, wann Bilder erzeugt wurden?

Hallo,

für eine Webseite ist eine Art Bildergalerie erstellt worden. Diese hat folgende Funktionalität:

Der Kunde ladet seine Bilder in ein neu angelegtes Bilderverzeichnis.
Das Galeriescript kann diese Bilder auf der Webseite im Orginalformat darstellen, wobei diese Bilder über Vorschaubilder erreichbar sind.
Diese Vorschaubilder werden physisch erzeugt, sobald das Script merkt, dass es zu einem neu angelegten Bilderverzeichnis noch kein Vorschaubildverzeichnis gibt, das folgendessen automatisch angelegt wird.

Das funktioniert auch ganz gut. Einen Haken hat die ganze Sache noch. Solange PHP im Hintergrund werkelt während es die Vorschaubilder erzeugt, wird die Galerie zum Glück noch nicht dargestellt. Ist PHP fertig mit der Konvertierung, stellt es die Galerie zwar dar, jedoch funktionieren die Bilder nicht, da die Galerie von den Bilder offensichtlich "noch nichts weiß". Mit anderen Worten: Es kommt mir so vor, als ob die Galerie dargestellt würde, bevor es noch von der Existenz der Bilder weiß. Klicke ich ab nun erneut auf die Galerie, funktioniert es problemlos. Die Bilder werden geladen.

Wie kann ich an das Problem rangehen?
Soll ich eien Art Verzögerung einbauen, oder irgendwie ein "Refresh". Wie weiß ich denn, wann PHP die Bilder zu Ende konvertiert hat, um das "Go" für die Darstellung zu bekommen?

Markus

--
  1. Hallöchen,

    ... jedoch funktionieren die Bilder nicht, da die Galerie von den Bilder offensichtlich "noch nichts weiß". Mit anderen Worten: Es kommt mir so vor, als ob die Galerie dargestellt würde, bevor es noch von der Existenz der Bilder weiß. Klicke ich ab nun erneut auf die Galerie, funktioniert es problemlos. Die Bilder werden geladen.

    Anscheinend hast du folgenden Ablauf:

    1. Dateisystem nach Bildern durchsuchen + gefundene "Bilder merken"
      2. Vorschaubilder erzeugen
      3. Galerie mit den "gemerkte Bilder" ausgeben

    Dass dann die bei 2. erst erzeugten Vorschaubilder unbekannt sind, ist logisch. Also musst du Punkt

    2.a) "gemerkte Bilder" um die neuen Bilder erweitern, oder Punkt 1 wiederholen

    einfügen.

    MfG
    vaudi

    1. Hallo,

      Anscheinend hast du folgenden Ablauf:

      1. Dateisystem nach Bildern durchsuchen + gefundene "Bilder merken"
        2. Vorschaubilder erzeugen
        3. Galerie mit den "gemerkte Bilder" ausgeben

      Die Bilder weden eigentlich on the fly dargestellt:

      Script sucht nach Bildverzeichnissen. (In diesen Verzeichnissen befinden sich auch die Infodateien, die den Linktext enthalten, für die Darstellung der Links auf der Hauptseite)
      Benutzer klickt Link zur Vorschaugalerie. Findet das Script zu diesem Bildverzeichnis, wo der Link dazugehört keine VOrschaubilder, werden diese erzeugt. Nach der Erzeugung wird die Galerie entgültig geladen. Bei ersten Mal Laden dauert es natürlich etwas länger, da die Galeriebilder ja erst in der Erzeugungsphase sind, die aber ab diesem Zeitpunkt permanent exisitieren und keine Probleme mehr verursachen. Obwohl die Galerie scriptbedingt erst angezeigt wird, nachdem die Bilder erzeugt wurden, werden sie beim ersten Mal doch noch nicht dargestellt, sondern erst nach dem Refresh.
      Mir fällt gerade ein, dass ich auch vergleichen könnte, welche Bildverzeichnisse mit den Orginalgrafiken neu sind, um diese mit einem Textfile abzugleichen und die Galerie erzeugen, bevor sie noch zum ersten Mal aufgerufen wird, aber das wäre doch etwas umständlich.

      Markus

      --
      1. Hallöchen,

        Script sucht nach Bildverzeichnissen. (In diesen Verzeichnissen befinden sich auch die Infodateien, die den Linktext enthalten, für die Darstellung der Links auf der Hauptseite)

        Dann stelle dabei fest, wann die jüngste Änderung war, und speicher dir nur diesen Timestamp ab - kannst du ja pro Verzeichnis separat machen.
        Sobald du das einmal gemacht hast, kannst du ab dem nächsten Mal den gefundenen jüngsten Timestamp mit dem gespeicherten vergleichen, und brauchst nur zu agieren, wenn die beiden nicht übereinstimmen.

        Benutzer klickt Link zur Vorschaugalerie. Findet das Script zu diesem Bildverzeichnis, wo der Link dazugehört keine VOrschaubilder, werden diese erzeugt. Nach der Erzeugung wird die Galerie entgültig geladen. Bei ersten Mal Laden dauert es natürlich etwas länger, da die Galeriebilder ja erst in der Erzeugungsphase sind, die aber ab diesem Zeitpunkt permanent exisitieren und keine Probleme mehr verursachen. Obwohl die Galerie scriptbedingt erst angezeigt wird, nachdem die Bilder erzeugt wurden, werden sie beim ersten Mal doch noch nicht dargestellt, sondern erst nach dem Refresh.

        Da fällt mir jetzt spontan ein, das Script ablaufen zu lassen, bevor die http-header gesendet werden. Wenn du neue Bilder machen musstest, dann sowas in der Art:

          
        <?php  
          echo "<meta http-equiv=\"refresh\" content=\"0; URL=".$url."\">";  
        ?>  
          
        <title>Galerie</title>  
          
        </head>  
        <body>&nbsp;</body>  
        </html>  
          
        <?php  
          exit;  
        ?>  
          
        
        

        Das sollte die Seite neu laden ohne dass zwischen erstem Aufruf und diesem refresh eine Ausgabe an den Browser erfolgt.

        MfG
        vaudi

        1. Hallo,

          <?php
            echo "<meta http-equiv="refresh" content="0; URL=".$url."">";
          ?>

          <title>Galerie</title>

          </head>
          <body>&nbsp;</body>
          </html>

          <?php
            exit;
          ?>

            
          So könnte ich es nicht machen. Die Seite ist natürlich bausteinartig aufgebaut und besteht aus 3 Teilen, wobei alle statischen Elemente, also der Kopfbereich und Bodenbereich, per SSI eingebunden werden. Da der o.g. Teil zu meinem Kopfteil gehört, kann ich keine seitenspezifischen Elemente hinzufügen.  
            
          Markus  
          
          -- 
          ![](http://signatur.pithax.net/linuxbanner.gif)
          
  2. Hallo Markus,

    Der Kunde ladet seine Bilder in ein neu angelegtes Bilderverzeichnis.
    Das Galeriescript kann diese Bilder auf der Webseite im Orginalformat darstellen, wobei diese Bilder über Vorschaubilder erreichbar sind.
    Diese Vorschaubilder werden physisch erzeugt, sobald das Script merkt, dass es zu einem neu angelegten Bilderverzeichnis noch kein Vorschaubildverzeichnis gibt, das folgendessen automatisch angelegt wird.

    warum erzeugst Du das Vorschaubild nicht gleich beim Hochladen?

    Freundliche Grüße

    Vinzenz

    1. Hallo,

      warum erzeugst Du das Vorschaubild nicht gleich beim Hochladen?

      Der Upload funktioniert nicht im Script sondern per FTP-Programm. Das hätte ich noch erwähnen sollen.

      Markus

      --
      1. Hallo Markus,

        warum erzeugst Du das Vorschaubild nicht gleich beim Hochladen?

        Der Upload funktioniert nicht im Script sondern per FTP-Programm. Das hätte ich noch erwähnen sollen.

        Ja, hättest Du :-)

        Was kannst Du tun?

        a) per cron-job in einem bestimmten Intervall fehlende Vorschaubilder
           erzeugen lassen. (könnte unschön sein, wenn ggf. ein Platzhalterbild
           angezeigt wird)

        b) Inotify verwenden, wenn möglich.

        c) die Seite nach dem EVA-Prinzip ausliefern (solltest Du eh' tun):
           - Request für Galerieseite erfolgt.
           - Seiteninhalt zusammenbauen
           - Vorhandensein aller Vorschaubilder überprüfen
             - ggf. fehlende erzeugen
           - Seiteninhalt ausliefern
           Dabei ist klar, dass die Seite *nicht* ausgehend von der Liste der
           Vorschaubilder zusammengestellt werden darf, sondern ausgehend von
           der Liste der Bilder im Originalformat zusammengestellt werden muss.
           Keine Ahnung, ob das Galerieskript das unterstützt - oder entsprechend
           angepasst werden kann.

        Ich empfehle Dir - falls einsetzbar - Lösung b) [1]

        Freundliche Grüße

        Vinzenz

        [1] ich zeige mich lernfähig.

        1. a) per cron-job in einem bestimmten Intervall fehlende Vorschaubilder
             erzeugen lassen. (könnte unschön sein, wenn ggf. ein Platzhalterbild
             angezeigt wird)

          Das wird nicht möglich sein. So ein cron müsste jede Sekunde laufen.

          b) Inotify verwenden, wenn möglich.

          c) die Seite nach dem EVA-Prinzip ausliefern (solltest Du eh' tun):
             - Request für Galerieseite erfolgt.
             - Seiteninhalt zusammenbauen
             - Vorhandensein aller Vorschaubilder überprüfen
               - ggf. fehlende erzeugen
             - Seiteninhalt ausliefern
             Dabei ist klar, dass die Seite *nicht* ausgehend von der Liste der
             Vorschaubilder zusammengestellt werden darf, sondern ausgehend von
             der Liste der Bilder im Originalformat zusammengestellt werden muss.
             Keine Ahnung, ob das Galerieskript das unterstützt - oder entsprechend
             angepasst werden kann.

          Genau so funktioniert mein Script. Nur ist es aber so, dass ich daraufhin überprüfe, ob das Verzeichnis mit Vorschaubildern exisitert. Tut es das, wird ab diesem Zeitpunkt die Ausgabe aus dem Vorschauverzeichnis aufgebaut, da das Orginalverz. und Vorschauverz. von den Namensinhalten her identisch sind, d.h. es gibt ein foto012.jpg sowohl im Vorschauverz. als auch im Orginalverz.
          Und das Problem liegt ja nicht daran, dass es die URLs nicht findet, sondern daran, dass die Bilder zu diesem Zeitpunkt offensichtlich noch nicht 100%ig "fertig" sind, wodurch sie noch nicht dargestellt werden können.
          inotify scheint mal ein guter Ansatz zu sein.

          Markus

          --
          1. Hallo Markus,

            a) per cron-job in einem bestimmten Intervall fehlende Vorschaubilder
               erzeugen lassen. (könnte unschön sein, wenn ggf. ein Platzhalterbild
               angezeigt wird)

            Das wird nicht möglich sein. So ein cron müsste jede Sekunde laufen.

            das kürzeste mir bekannte Intervall für einen cron-Job ist eine Minute.
            Wenn diese Zeitdifferenz nicht tragbar ist, dann ist ein cron-Job keine Lösung.

            c) die Seite nach dem EVA-Prinzip ausliefern (solltest Du eh' tun):
               - Request für Galerieseite erfolgt.
               - Seiteninhalt zusammenbauen
               - Vorhandensein aller Vorschaubilder überprüfen
                 - ggf. fehlende erzeugen
               - Seiteninhalt ausliefern
               Dabei ist klar, dass die Seite *nicht* ausgehend von der Liste der
               Vorschaubilder zusammengestellt werden darf, sondern ausgehend von
               der Liste der Bilder im Originalformat zusammengestellt werden muss.
               Keine Ahnung, ob das Galerieskript das unterstützt - oder entsprechend
               angepasst werden kann.

            Genau so funktioniert mein Script. Nur ist es aber so, dass ich daraufhin überprüfe, ob das Verzeichnis mit Vorschaubildern exisitert.

            hmm, offensichtlich nicht nach

            V wie Verarbeitung
            A wie Ausgabe (die erst *nach* der Verarbeitung erfolgt),

            Und das Problem liegt ja nicht daran, dass es die URLs nicht findet, sondern daran, dass die Bilder zu diesem Zeitpunkt offensichtlich noch nicht 100%ig "fertig" sind, wodurch sie noch nicht dargestellt werden können.

            Du lieferst doch schon während der Verarbeitung Teile aus.

            inotify scheint mal ein guter Ansatz zu sein.

            deswegen habe ich es Dir ja auch empfohlen.

            Freundliche Grüße

            Vinzenz

  3. Offensichtlich lag der Hund wo anders begraben.
    Mein Script funktionierte eigentlich einwandfrei, d.h. meine Galerie wird tatsächlich erst nach der Erstellung der Bilder dargstellt. (Mich wunderte ja die ganze Zeit, warum etwas "HTTP-spezifisches", was ich in Perl schon mal realisierte, in PHP nicht funktionieren sollte)
    Der Fehler lag darin, dass der Bildgenerator beim Erzeugen der Files eine falsche URL zurücklieferte in der Form:

    2008-05-03/vorschauFiles/2008-05-03/vorschauFiles/bildname.jpg

    Dadurch sah es in der Galerie so aus, als ob die Bilddateien noch nicht dargestellt werden könnten, da es den Anschein erweckte, die Bilder würden noch nicht vorhanden sein, obwohl man die Verzögerung merkt, während PHP im Hintergrund werkelt. Die Bilder sind letztendlich vorhanden gewesen, nur die URL zu diesen stimmte nicht.
    Und warum es nach dem Refresh funktionierte liegt einfach darin begründet, dass das Bildgenerator-Script ja jetzt nicht mehr ausgeführt wird, somit keine falsche URL zurückliefern kann, und das Hauptscript sowieso automatisch die richtige URL anzeigt.

    Ich kam aber auch nur durch Zufall darauf, weil plötzlich überhaupt keine Bilder mehr erzeugt werden konnte ich ich mich wunderte warum.
    Ich verglich schon mit dem diff-Tool das Backup und das aktuelle Script, und kam trotzdem nicht drauf.
    Dann fiel mir ein, dass meine IP-Adresse nicht mehr stimmte, da ich zuvor das Netzwerk neu initialisierte um Daten von meinem Notebook rüberkopieren zu können, und ich deswegen meinen Router anwerfen und mein Netzwerkkabel umstecken musste. (Mein PC hängt nur am Router, wenn ich mit dme Notebook kommunizieren muss, sonst direkt am Modem)
    Da ich aber Apache nicht neu startete, wusste Apache nichts davon, dass die alte IP nicht mehr gilt.
    Warum das automatische Bilderzeugen des Scripts damit etwas zu tun hat, ist mir trotzdem nicht ganz klar, denn eigentlich dürfte ja Apache nach IP-Änderung gar nicht mehr erreichbar sein, aber vielleicht kann mich ja jemand darüber aufklären.

    Jedenfalls löste sich mein Problem nun von ganz alleine.

    Markus