2017-04-02 8 views
1

ich den nächsten Code bin mit meinen Bilder zu machen:Rendered Bild php langsamen Laden in Chrom

// 1. Check if image exists 
$image = glob("public/images/$category/$id/$name.*"); 

// Image exists 
if(count($image) === 1) { 
    // 2. Get file extension 
    $path_parts = pathinfo($image[0]); 

    // 3. Add the content type to the header 
    switch(strtolower($path_parts['extension'])) 
    { 
     case "gif": 
      header("Content-type: image/gif"); 
      break; 
     case "jpg": 
     case "jpeg": 
      header("Content-type: image/jpeg"); 
      break; 
     case "png": 
      header("Content-type: image/png"); 
      break; 
     case "bmp": 
      header("Content-type: image/bmp"); 
      break; 
     case "svg": 
      header("Content-type: image/svg+xml"); 
      break; 
     default: 
      self::setNotFoundHeaders(); 
      break; 
    } 

    // 4. Set the rest of the Header information 
    header("Expires: Mon, 1 Jan 2099 05:00:00 GMT"); 
    header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 
    header("Cache-Control: no-store, no-cache, must-revalidate"); 
    header("Cache-Control: post-check=0, pre-check=0", false); 
    header("Pragma: no-cache"); 
    // 5. Get the size for content length 
    $size= filesize($image[0]); 
    header("Content-Length: $size bytes"); 
    // 6. Output the file contents 
    readfile($image[0]); 
} 

das Bild lädt perfekt in IE, Chrome und Firefox, aber während es 100 ms dauert in IE und Firefox laden dauert das Laden in Chrome 5 Sekunden. Dies ist, was der Netzwerk-Chrome-Tab wie folgt aussieht:

chrome network

Auch wenn es 5 Sekunden dauert geladen ist, wird das Bild ist fertig und sichtbar mit normaler Geschwindigkeit, in etwa 100 ms.

Auch Sie können in dem Bild sehen, dass der Dateityp "Dokument" und nicht "Bild" ist, IDK warum.

Ich habe verschiedene Code versucht, mit dem Bild zu machen, aber ich habe das gleiche Verhalten:

$fp = fopen($image[0], 'rb'); 
fpassthru($fp); 

Was mache ich falsch? Fehle ich einige Überschriften?

Vielen Dank für Ihre Zeit!

Antwort

0

Es ist nichts falsch in dem Code, den Sie geschrieben haben, außer dass der Header Content-Length nur die Anzahl der Bytes angeben muss (ohne das Wort Bytes).

header("Content-Length: $size"); 

Auch mit diesem kleinen Fehler sollte jedoch Ihr Code gut laufen.

Ich habe einige Code, die Bilder rendern, ich habe es mit Ihren exakten Kopfzeilen ("Bytes" Fehler enthalten) versucht und das Ergebnis in Chrome Webtools überprüft. Die Bilder werden normal geladen.

sagte, dass ich diesen Code nach mehr, was man versuchen würde, das Hinzufügen readfile()

// Flush (if any) all the buffers 
while(ob_get_level() > 0) { ob_end_flush(); } 

// Ensure script execution terminates here 
exit(); 

Wenn Sie immer noch das Problem, würde ich die Möglichkeit in Betracht ziehen, dass es in Chrome Web-Tool nur ein Fehler ist. Vor allem, weil Sie bemerkt haben, dass das Bild tatsächlich ohne Verzögerungen geladen wird.

+0

Danke @paolo! 'while (ob_get_level()> 0) {ob_end_flush(); } 'Hat den Trick gemacht. Während ich auf eine Antwort wartete, versuchte ich die Dinge, dieser Header stoppt auch die Ladung, nachdem das Bild angezeigt wird: 'header (" Verbindung: Schließen "), aber in der Dokumentation heißt es, dass Nachrichtenköpfe, die im Connection-Header aufgelistet sind, NICHT Include End-to-End-Header, wie Cache-Control. Also möglicherweise Konflikte mit den Cache-Steuerheader, die ich benutze, IDK ... Sollte ich die Puffer leeren oder den vorherigen Header hinzufügen? Nochmals vielen Dank für Ihre Zeit –

+0

spülen Sie einfach die Puffer und beenden Sie() – Paolo