Ergebnis 1 bis 3 von 3

Thema: Probleme mit PHP Zufallsbild ausgabe im Safari

  1. #1
    Contao-Nutzer
    Registriert seit
    06.04.2013.
    Beiträge
    83

    Standard Probleme mit PHP Zufallsbild ausgabe im Safari

    Hallo zusammen,

    ich sitze mal wieder vor einem merkwürdigen Problem. Und zwar wird im Header auf meiner Seite http://an-sehen.com ein Zufallsbild ausgegeben.

    Dies geschieht mittels einem PHP Script.

    PHP-Code:
    <?php

    /*

        AUTOMATIC IMAGE ROTATOR
        Version 2.2 - December 4, 2003
        Copyright (c) 2002-2003 Dan P. Benjamin, Automatic, Ltd.
        All Rights Reserved.

        http://www.hiveware.com/imagerotator.php
        
        http://www.automaticlabs.com/
        
        
        DISCLAIMER
        Automatic, Ltd. makes no representations or warranties about
        the suitability of the software, either express or
        implied, including but not limited to the implied
        warranties of merchantability, fitness for a particular
        purpose, or non-infringement. Dan P. Benjamin and Automatic, Ltd.
        shall not be liable for any damages suffered by licensee
        as a result of using, modifying or distributing this
        software or its derivatives.
        
        
        ABOUT
        This PHP script will randomly select an image file from a
        folder of images on your webserver.  You can then link to it
        as you would any standard image file and you'll see a random
        image each time you reload.
        
        When you want to add or remove images from the rotation-pool,
        just add or remove them from the image rotation folder.


        VERSION CHANGES
        Version 1.0
            - Release version
        
        Version 1.5
            - Tweaked a few boring bugs
        
        Version 2.0
            - Complete rewrite from the ground-up
            - Made it clearer where to make modifications
            - Made it easier to specify/change the rotation-folder
            - Made it easier to specify/change supported image types
            - Wrote better instructions and info (you're them reading now)
            - Significant speed improvements
            - More error checking
            - Cleaner code (albeit more PHP-specific)
            - Better/faster random number generation and file-type parsing
            - Added a feature where the image to display can be specified
            - Added a cool feature where, if an error occurs (such as no
              images being found in the specified folder) *and* you're
              lucky enough to have the GD libraries compiled into PHP on
              your webserver, we generate a replacement "error image" on
              the fly.
            
        Version 2.1
            - Updated a potential security flaw when value-matching
              filenames

        Version 2.2
            - Updated a few more potential security issues
            - Optimized the code a bit.
            - Expanded the doc for adding new mime/image types.

            Thanks to faithful ALA reader Justin Greer for
            lots of good tips and solid code contribution!


        INSTRUCTIONS
        1. Modify the $folder setting in the configuration section below.
        2. Add image types if needed (most users can ignore that part).
        3. Upload this file (rotate.php) to your webserver.  I recommend
           uploading it to the same folder as your images.
        4. Link to the file as you would any normal image file, like this:

                <img src="http://example.com/rotate.php">

        5. You can also specify the image to display like this:

                <img src="http://example.com/rotate.php?img=gorilla.jpg">
            
            This would specify that an image named "gorilla.jpg" located
            in the image-rotation folder should be displayed.
        
        That's it, you're done.

    */




    /* ------------------------- CONFIGURATION -----------------------


        Set $folder to the full path to the location of your images.
        For example: $folder = '/user/me/example.com/images/';
        If the rotate.php file will be in the same folder as your
        images then you should leave it set to $folder = '.';

    */


        
    $folder '.';


    /*    

        Most users can safely ignore this part.  If you're a programmer,
        keep reading, if not, you're done.  Go get some coffee.

        If you'd like to enable additional image types other than
        gif, jpg, and png, add a duplicate line to the section below
        for the new image type.
        
        Add the new file-type, single-quoted, inside brackets.
        
        Add the mime-type to be sent to the browser, also single-quoted,
        after the equal sign.
        
        For example:
        
        PDF Files:

            $extList['pdf'] = 'application/pdf';
        
        CSS Files:

            $extList['css'] = 'text/css';

        You can even serve up random HTML files:

            $extList['html'] = 'text/html';
            $extList['htm'] = 'text/html';

        Just be sure your mime-type definition is correct!

    */

        
    $extList = array();
        
    $extList['gif'] = 'image/gif';
        
    $extList['jpg'] = 'image/jpeg';
        
    $extList['jpeg'] = 'image/jpeg';
        
    $extList['png'] = 'image/png';
        

    // You don't need to edit anything after this point.


    // --------------------- END CONFIGURATION -----------------------

    $img null;

    if (
    substr($folder,-1) != '/') {
        
    $folder $folder.'/';
    }

    if (isset(
    $_GET['img'])) {
        
    $imageInfo pathinfo($_GET['img']);
        if (
            isset( 
    $extListstrtolower$imageInfo['extension'] ) ] ) &&
            
    file_exists$folder.$imageInfo['basename'] )
        ) {
            
    $img $folder.$imageInfo['basename'];
        }
    } else {
        
    $fileList = array();
        
    $handle opendir($folder);
        while ( 
    false !== ( $file readdir($handle) ) ) {
            
    $file_info pathinfo($file);
            if (
                isset( 
    $extListstrtolower$file_info['extension'] ) ] )
            ) {
                
    $fileList[] = $file;
            }
        }
        
    closedir($handle);

        if (
    count($fileList) > 0) {
            
    $imageNumber time() % count($fileList);
            
    $img $folder.$fileList[$imageNumber];
        }
    }

    if (
    $img!=null) {
        
    $imageInfo pathinfo($img);
        
    $contentType 'Content-type: '.$extList$imageInfo['extension'] ];
        
    header ($contentType);
        
    readfile($img);
    } else {
        if ( 
    function_exists('imagecreate') ) {
            
    header ("Content-type: image/png");
            
    $im = @imagecreate (100100)
                or die (
    "Cannot initialize new GD image stream");
            
    $background_color imagecolorallocate ($im255255255);
            
    $text_color imagecolorallocate ($im0,0,0);
            
    imagestring ($im255,  "IMAGE ERROR"$text_color);
            
    imagepng ($im);
            
    imagedestroy($im);
        }
    }

    ?>
    Dieses PHP Script wird direkt in CSS eingebunden. Also mit dem Befehl: background:url("files/headerbilder/rotate.php") no-repeat center top;

    Nun zum Problem. In allen Browsern bis auf dem Safari 7 Browser funktioniert das Script. Bei jedem neuen Laden wird also ein zufälliges Bild dargestellt. Im Safari 7 allerdings kommt bei jedem Neuladen der Seite immer das selbe Bild. Wenn ich nun aber manuell das PHP Script im Safari aufrufe (http://an-sehen.com/files/headerbilder/rotate.php, funktioniert es an sich tadellos. Nur in Verbindung mit Contao und css scheint es Probleme zu geben. Vielleicht liegt es auch an irgendeiner Browser Einstellung?

    Vielleicht hat ja hier jemand einen Tipp für mich. Wäre Großartig. Danke.

  2. #2
    Administratorin Avatar von lucina
    Registriert seit
    19.06.2009.
    Ort
    Kiel (DE)
    Beiträge
    7.376
    Partner-ID
    152
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    1. Ich frage mich, weshalb Du ein externes Script nutzt, wo es doch in Contao sogar ein Coremodul zur Anzeige eines Zufallsbildes gibt.

    2. Genau deshalb handelst Du Dir ein Caching-Problem ein, denn von der Generierung eines neuen Bildes bekommt Contao nichts mit und sendet brav einen #304 (not modified) - was Safari angesichts des recht aggressiven Browsercachings veranlasst, die Seite komplett aus dem eigenen Zwischenspeicher zu ziehen.

    3. Das Problem ist nicht neu, der Effekt ist auch dann zu beobachten, wenn eine Seite unvollständig geladen wird und dann ein reload durchgeführt wird. Der #304 bringt Safari dann vollkommen aus dem Tritt - das gibt dann im Extremfall eine weiße Seite (siehe unter anderem http://tech.vg.no/2013/10/02/ios7-bu...d-from-server/).

    Lösungen könnten sein, entweder das Contaomodul zu nutzen (und das entsprechende Tempate so zu ändern, dass es ein background-image ausgibt) oder extra für Safari einen gefakten Statuscode (also #200 anstatt #304) zurückzuliefern, dass dann zum Laden vom Webserver zwingt. Entscheide selbst, was Du machen möchtest ... ;-)
    Geändert von lucina (17.12.2013 um 23:15 Uhr)

  3. #3
    Contao-Nutzer
    Registriert seit
    06.04.2013.
    Beiträge
    83

    Standard

    Zitat Zitat von lucina Beitrag anzeigen
    1. Ich frage mich, weshalb Du ein externes Script nutzt, wo es doch in Contao sogar ein Coremodul zur Anzeige eines Zufallsbildes gibt.
    Ich benutzte für den Header ja einen parallax Effekt. Dieser Effekt funktioniert leider nur, wenn das Hintergrundbild via CSS gesetzt wird. Das Contao Coremodul lädt die Bilder leider nur direkt in den HTML Code wenn ich das richtig gesehen habe. Dann funktioniert leider der parallax aber nicht mehr. Alternative parallax scripte die ich zum laufen bekommen habe, habe ich leider nicht gefunden. Aus dem Grund muss ich das Zufallsbild per PHP erzeugen und dieses per CSS laden.

    Zitat Zitat von lucina Beitrag anzeigen
    2. Genau deshalb handelst Du Dir ein Caching-Problem ein, denn von der Generierung eines neuen Bildes bekommt Contao nichts mit und sendet brav einen #304 (not modified) - was Safari angesichts des recht aggressiven Browsercachings veranlasst, die Seite komplett aus dem eigenen Zwischenspeicher zu ziehen.


    3. Das Problem ist nicht neu, der Effekt ist auch dann zu beobachten, wenn eine Seite unvollständig geladen wird und dann ein reload durchgeführt wird. Der #304 bringt Safari dann vollkommen aus dem Tritt - das gibt dann im Extremfall eine weiße Seite (siehe unter anderem http://tech.vg.no/2013/10/02/ios7-bu...d-from-server/).

    Das es was mit dem Cache zu tun haben könnte, habe ich auch schon fast vermutet. Der Artikel ist auf jeden Fall interessant. Hab ich so auch noch nicht gewusst.

    Zitat Zitat von lucina Beitrag anzeigen
    Lösungen könnten sein, entweder das Contaomodul zu nutzen oder extra für Safari einen gefakten Statuscode (also #200 anstatt #304) zurückzuliefern, dass dann zum Laden vom Webserver zwingt. Entscheide selbst, was Du machen möchtest ... ;-)
    Das geht dann wohl mit Varnish? Muss ich mir mal angucken und schauen ob ich das raff

    Dank dir auf jeden Fall schon mal

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •