哪个更有效:重定向到图像,或通过PHP推送图像?

时间:2014-06-24 20:10:23

标签: php image performance redirect

外部方必须使用我们网站上使用的动态生成的图像。为此,我创建了一个通过URL提供图像的功能。例如。 http://test.com/image/ $代码/ $宽度/ $高度。因此,它找到代码为$ code的图像,将其大小调整为$ width和$ height,然后提供图像本身(而不是url)。外部方现在可以使用<img src="http://test.com/image/$code/$width/$height" />

这很好用,但当然每次使用它时服务器都会受到很大影响,特别是如果图像用于发送给1000人的简报中。

我可以通过检查图像是否已经存在然后返回而不首先生成图像来提高效率。但我也在考虑重定向。

所以,基本上,我的问题是生成/加载图像然后提供它,或者执行301重定向到实际图像是否更有效。我知道这也有一些缺点,最明显的是每个图像需要两个请求,但我想知道如何通过php和图像生成过程推送整个图像。

更新

也许我应该澄清一些事情。

  1. 我对服务器负载感兴趣,而不是UX。最有可能后者通过重定向更糟糕,因为它执行了双倍的服务器请求)。
  2. 两种情况的区别如下:
  3. 图像生成情况:

    - Check if image exists. If not, generate.
    - Then do this
    
    $path       = BASE_PATH."/".$image->Filename;
    $mimetype   = image_type_to_mime_type(exif_imagetype($path));
    
    header("Content-type: ".$mimetype);
    echo readfile($path);
    die;
    

    图像重定向情况:

    - Check if image exists. If not, generate.
    - Then do this
    
    $location   = BASE_HREF."/".$image->Filename;
    $mimetype   = image_type_to_mime_type(exif_imagetype($path));
    header('Location: '.$location,true,301); //or maybe a 303 (other)
    die;
    

    显然,在第二种情况下,php必须做得更少,而apache更多(提供2个文件而不是1个)。在第一种情况下,apache必须做更多而且php更少。所以问题是,php必须做的额外工作是否比Apache必须做的额外工作更多或更少?

2 个答案:

答案 0 :(得分:1)

我不知道,但我的直觉是,如果你已经在运行PHP脚本,那么编写一些标题并调用readfile()的额外费用将是微不足道的。

更重要的是,该文件是否会被同一个用户多次使用? 如果是这样,您可以通过使文件可缓存来获益。如果您重定向到静态文件,Web服务器将自动处理缓存。如果您通过PHP提供文件,则必须自己缓存。

为此,您需要:

  • 计算Last-Modified日期或ETag(唯一ID)。
  • 检查If-Modified-Since:If-None-Match:标题的请求标头。
  • 将标题值与计算日期或ETag进行比较。
  • 如果您的文件较新或与ETag不匹配(或请求标头不存在),请发送包含该文件的200响应。
  • 否则,请发送没有该文件的304响应。
  • 在这两种情况下,请发送当前的Last-Modified:ETag标头,也许是明智的Expires:标头。

答案 1 :(得分:0)

首先,在生成事物之前检查图像是否已存在至关重要。它不会帮助“一点点”。创建.jpg比批次比检查文件名更贵。

你的其他问题对我来说并不完全清楚,但无论如何我都会尝试回答。

301重定向通常不用于您所说的内容。他们要告诉搜索蜘蛛页面已永久移动。从功能上讲,它与常规重定向没有任何区别。

继续前进,我更加困惑。 “然后提供图像本身(而不是网址)”

服务器几乎总是同时服务。 url告诉它要发送哪个文件,然后它发送它在该URL找到的二进制数据。并且文件总是保存在某个地方,即使它只是一个tmp文件夹,它将被删除。除非你做过异国情调,否则问问自己为什么这样做。

如果图像永远不会再次使用(即使同一个用户重新访问同一页面),只需向远程服务器发送一个链接,指向创建映像后服务器上临时文件夹中的生命。如果图像可能重新使用,请将其保存在某处。本地服务器将更容易,远程的额外请求不会减慢显着的数量。