2017-04-02 13 views
1

に私は私の画像をレンダリングするために、次のコードを使用しています:イメージのロードはIE、ChromeとFirefoxで完璧レンダリング画像PHP遅いロードクロム

// 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]); 
} 

が、それはIEとFirefoxでロードするために100ミリ秒かかりながら、 Chromeでの読み込みには5秒かかります。これは、クロームのネットワークタブは次のようになります。

chrome network

それがロードを完了するために5秒を要した場合でも、画像は約100ミリ秒で、通常の速度で準備し、表示されています。

また、あなたはなぜIDKの、ファイルタイプは「文書」ではなく「イメージ」であることを画像で見ることができます。

私は、画像をレンダリングするために別のコードを使用して試してみましたが、私は同じ動作を得た:私が間違って

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

何をしているのですか?私はいくつかのヘッダーが欠けていますか?

ありがとうございました!

答えて

0

あなたはContent-Lengthヘッダが(ワードバイトなし)バイト数だけを指定しなければならないことを除いて掲載コードで間違っては何もありません。

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

小さなミスでも、コードは正常に動作するはずです。

は、私は私はあなたの正確なヘッダでそれを試してみました(「バイト」の間違いが含まれている)とChrome Webツールで結果を検査、画像をレンダリングするいくつかのコードを持っています。イメージは正常にロードされます。

あなたはまだ私はそれがChromeウェブツールでちょうどグリッチだという可能性を検討する問題が発生した場合、私はreadfile()

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

// Ensure script execution terminates here 
exit(); 

後にこのコードを追加するもう一つのことをしようとするだろうと述べました。あなたは、画像が遅延なく実際に読み込まれていることに気付いたので、

+0

おかげで@paolo! 'while(ob_get_level()> 0){ob_end_flush(); } 'はトリックをしました。 'header(" Connection:close ")'と書かれていますが、ドキュメントには 'Connectionヘッダーにリストされているメッセージヘッダーは使用できませんこのようなキャッシュ・Control.'など、エンド・ツー・エンドのヘッダは、ので、多分それは私が使用したキャッシュ制御ヘッダと競合などがIDKの...私はバッファをフラッシュしたり、前のヘッダを追加使用する必要がありますか?おかげで再びお時間を –

+0

だけバッファして終了し(フラッシュ) – Paolo