【问题标题】:PHP Content-length header delays loadingPHP Content-length 标头延迟加载
【发布时间】:2013-02-17 18:11:12
【问题描述】:

我有一个 PHP 网页,它从数据库中获取 BLOB 并将其输出为图像。当用户上传这张图片时,我将文件大小(例如 491099)存储到数据库中。

当通过我的网页请求图像时,我添加水印,设置HTTP HEADERS 并通过imagejpeg($img) 输出图像。现在的问题是,当我的图像完全加载(几乎不需要时间)时,我的浏览器仍然看起来“忙”(加载指示器旋转)。当通过异步调用请求此页面时,这也会使加载时间变长,即使图像实际上很快就被加载了。

当我简单地删除 Content-length 标头时,图像会像以前一样加载,但现在浏览器会在加载时立即停止,因此处理时间非常快。

因此,浏览器似乎认为(由于我的 Content-length 标头)它应该仍在加载某些内容,而实际上并未加载...

删除Content-length 标头不是选项,因为我读过的许多浏览器都需要这样做。

// set the header for the image
header("Content-length: " . $image->imageSize);    //would be 491099 in my example
header("Content-type: " . $image->imageType);
header('Content-Disposition: inline; filename=" '. $image->imageName . '"');

$watermark          = imagecreatefrompng('../images/watermark.png');
$watermark_width    = imagesx($watermark); 
$watermark_height   = imagesy($watermark);  
$dest_x             = ($image->imageWidth - $watermark_width) / 2;  
$dest_y             = $image->height - $watermark_height - 5;
$img = imagecreatefromstring($image->image);
imagecopymerge($img, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, 55);

imagejpeg($img);

(请注意,$image 是我创建的自定义图像类的对象,其中包含有关图像的所有信息。)

有人知道我为什么会有这种行为吗?

谢谢!

【问题讨论】:

  • 您正在通过添加水印来更改图像的内容(因此也很可能会更改图像数据的大小),但您将Content-length-header 设置为原始大小图片。这听起来像是自找麻烦。
  • Content-Length 应该表示实际发送的内容的长度。如果您不确定,请不要发送 Content-Length
  • @fireeyedboy 我也一直在考虑这个问题,但我认为在未更改的图像上添加 11kB 的水印不应该真正改变文件大小..?
  • 我的猜测-当您添加水印时,您使用的压缩值与原始图像不同(imagejpeg 默认为 75),因此您发送的数据没有您说的那么多它一直在等待剩余的数据。添加水印后重新计算。

标签: php http-headers content-length php-gd


【解决方案1】:

试试吧:

ob_start();
imagejpeg($img);

// this should be the real image size
$size = ob_get_length();

header("Content-length: " . $size); 

// send it
ob_flush();

【讨论】:

  • 好的,谢谢,这个解决方案对我的性能有什么影响?我认为处理时间会更长......?
  • 不,这不应该发生。如果仍然存在,则问题一定出在其他地方
  • 我觉得奇怪的是 PHP 不允许你以另一种方式定义新的内容大小,但是是的......它成功了。感谢@fireeyedboy 对我的问题的评论并解释了这个问题。接受这个答案,因为它是唯一相关的。 :)
【解决方案2】:

在未更改的图像上添加水印会创建一个新图像,该图像几乎肯定会有不同的文件大小,特别是如果它是 jpeg(有损压缩)。事实上,即使您不进行任何修改,某些图像程序和库也会重新压缩 jpg,从而导致文件内容不同(尽管可能不是明显不同的图像)。

One Trick Pony 的答案将为您提供正确的新图像文件大小,并且对性能的影响最小。

另一种选择是在将 blob 保存到数据库之前添加水印,但随后您将无法呈现原始图像。

【讨论】:

  • 是的,但这不是一个选项,因为我有时需要原始图像。不过谢谢! :)
猜你喜欢
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-15
相关资源
最近更新 更多