Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 向图像URL添加md5字符串值得吗?_Php_Caching_Md5_Etag_Md5 File - Fatal编程技术网

Php 向图像URL添加md5字符串值得吗?

Php 向图像URL添加md5字符串值得吗?,php,caching,md5,etag,md5-file,Php,Caching,Md5,Etag,Md5 File,我正在通过PHP动态生成一个页面。我正在使用站点的输出字符串生成一个Etag,并检查该字符串,以便在自上次请求以来站点未更改时发送304(未修改) 我现在也在努力改进我网站上图片的缓存。每个站点上有6到30张图片(jpg,70-200KB)。我希望用户重新加载图片,如果其内容已更改。我正在考虑通过向每张图片的URL添加查询字符串来实现这一点: src=“'.$files[$x]”?id='.md5_文件($files[$x])。” 这是否太复杂,每个请求都会产生太多的工作负载,还是值得? 正如我

我正在通过PHP动态生成一个页面。我正在使用站点的输出字符串生成一个Etag,并检查该字符串,以便在自上次请求以来站点未更改时发送304(未修改)

我现在也在努力改进我网站上图片的缓存。每个站点上有6到30张图片(jpg,70-200KB)。我希望用户重新加载图片,如果其内容已更改。我正在考虑通过向每张图片的URL添加查询字符串来实现这一点:

src=“'.$files[$x]”?id='.md5_文件($files[$x])。”

这是否太复杂,每个请求都会产生太多的工作负载,还是值得? 正如我所说:我为每个图像生成那些md5哈希,然后为输出字符串生成一个md5哈希,以便在每个请求中将其用作Etag

以下是我的图像中的响应标题:

HTTP/1.1 304 Not Modified
Date: Mon, 10 Dec 2012 08:56:49 GMT
Server: Apache
Connection: keep-alive, Keep-Alive
Keep-Alive: timeout=1, max=99
ETag: "360f-4d02f5fcfc34f"
Expires: Mon, 07 Jan 2013 08:56:49 GMT
Cache-Control: max-age=2419200, must-revalidate

多谢各位

使用基于时间的缓存头意味着客户端在一段时间内根本不会询问服务器文件是否已更新。
使用Etag缓存头意味着客户端每次都会询问服务器,但不需要每次都传输数据

这两种方法各有利弊。对于很少更改的资产,您应该使用基于时间的缓存头,因为这将从服务器上占用大量负载。为了在更新后仍能保持这些更新,在URL中添加一个唯一的标记是一个好主意。对于经常更新的资产,使用不带基于时间的缓存头(或非常短的缓存头)的ETag是一个好主意,因为这意味着它们将在更新后立即更新,同时仍然减轻服务器的负载。通常,您希望标记动态网页并对图像资产进行时间缓存


因此,是的,如果让客户端尽快下载更新版本是一个真正的问题,那么在静态时间缓存资产的URL中添加md5哈希是一个好主意。确保添加这些散列不会比节省的开销更大。

通常web服务器会处理此类人员,并正确设置头304和200。您不需要设置任何get变量来正确地重新加载它。为每个图像实现适当的缓存头。如果它们可以随时更改,请不要发送阻止浏览器询问服务器的标题,而是允许以304状态回答每个图像。使用您自己的策略意味着您每次都必须对每个图像进行校验和-这也会阻止缓存您的PHP页面。谢谢您的回答!我决定坚持为我的php站点创建ETag,但放弃为我的图像创建哈希查询。只要在响应头中确定,浏览器就会缓存它们。对我来说,为每个请求中的每个图像创建md5总和似乎是一项开销。