渲染图像php慢速加载铬

时间:2017-04-02 19:43:28

标签: php image google-chrome header render

我正在使用下一个代码来渲染我的图像:

// 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,Chrome和Firefox中完美加载,但在IE和Firefox中加载需要100毫秒,在Chrome中加载需要5秒钟。这就是Chrome的网络标签:

chrome network

即使完成加载需要5秒钟,图像仍然准备就绪并以正常速度显示,大约100毫秒。

另外你可以在图像中看到文件类型是“文档”而不是“图像”,idk为什么。

我尝试使用不同的代码来渲染图像,但我也有同样的行为:

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

我做错了什么?我错过了一些标题吗?

感谢您的时间!

1 个答案:

答案 0 :(得分:0)

您发布的代码没有任何问题,只是Content-Length标头必须只指定字节数(不包括单词字节)。

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

即使有这个小错误,但你的代码应运行正常。

我有一些渲染图片的代码,我尝试使用您的确切标题("字节"包含错误)并在Chrome网络工具中检查结果。图像正常加载。

说我会在readfile()

之后再尝试添加此代码
// Flush (if any) all the buffers
while( ob_get_level() > 0 ) { ob_end_flush(); }

// Ensure script execution terminates here
exit();

如果您仍然遇到此问题,我会考虑它可能只是Chrome网络工具中的一个小故障。特别是因为您已经注意到图像实际上没有延迟加载。