gpt4 book ai didi

php - 处理 PHP 脚本中的 If-modified-since header

转载 作者:行者123 更新时间:2023-12-03 00:26:12 24 4
gpt4 key购买 nike

我有一个使用 ?img= 参数调用的 PHP 脚本。

该参数的值是图像的(urlencoded)URL。

我的脚本检查该图像是否已存储在我的服务器上。

如果没有 - 它会下载它。之后,它可以选择调整图像大小并将其发送到 STDOUT,即返回到请求浏览器,并在前面添加 Content-TypeLast-modified header :

Connection:close
Content-Type:image/jpeg
Date:Fri, 01 Jun 2012 08:28:30 GMT
Last-Modified:Fri, 01 Jun 2012 08:02:44 GMT
Server:Apache/2.2.15 (CentOS)
Transfer-Encoding:chunked
X-Powered-By:PHP/5.3.3

这是解决一些跨域问题所必需的,并且一年多以来对我来说效果很好:

screenshot

但是,我想添加功能来处理传入的 If-Modified-since header - 发送 Not Modified 304 响应。

我的问题是:

1) 当在 Apache 中运行时,这在 PHP 中是否可能?

2)如何在 PHP 中最好地处理(即解析和生成)日期?

额外问题)如何为调整大小的图像添加 Content-Length header ?

我的代码如下(我省略了 CURL 下载部分):

<?php

define('CACHE_DIR', '/var/www/cached_avatars/');

$img = urldecode($_GET['img']);
$cached = CACHE_DIR . md5($img);

# omitted downloading part for brevity

$readfh = fopen($cached, 'rb');
if ($readfh) {
flock($readfh, LOCK_SH);

$size = getimagesize($cached);
$w = $size[0];
$h = $size[1];
$type = $size[2];
$mime = $size['mime'];

# find the downscale factor to fit image into $maxw x $maxh
$scale = max($w / $maxw, $h / $maxh);

header('Content-Type: ' . $size['mime']);
header('Last-Modified: ' . gmdate('D, d M Y H:i:s T', filemtime($cached)));

$length = filesize($cached);
$buf = fread($readfh, $length);
fclose($readfh);

# the image is smaller than $maxw x $maxh, do not scale up
if ($scale <= 1) {
header('Content-Length: ' . $length);
print($buf);
return;
}

$tw = $w / $scale;
$th = $h / $scale;
$image = imagecreatefromstring($buf);
$thumb = imagecreatetruecolor($tw, $th);
imagecopyresampled($thumb, $image, 0, 0, 0, 0, $tw, $th, $w, $h);
imagedestroy($image);

# How to add Content-Length here, after image resizing?

if (IMAGETYPE_JPEG == $type)
imagejpeg($thumb, null, 75);
else if (IMAGETYPE_PNG == $type)
imagepng($thumb, null, 9);
else if (IMAGETYPE_GIF == $type)
imagegif($thumb, null);

imagedestroy($thumb);
}

?>

最佳答案

这在 PHP 中绝对是可能的!

当浏览器检查是否有修改时,它会发送一个 If-Modified-Since header ;在 PHP 中,该值将在 $_SERVER['HTTP_IF_MODIFIED_SINCE'] 内设置。

要解码日期/时间值(我相信使用 rfc822 编码),您可以使用 strtotime(),因此:

if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && 
strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= filemtime($localFileName))
{
header('HTTP/1.0 304 Not Modified');
exit;
}

说明:如果浏览器发送 If-Modified-Since header ,并且日期/时间至少是您所提供的文件的修改日期,则您将写入“304 Not”修改”标题并停止。

否则,脚本将按正常方式继续。

关于php - 处理 PHP 脚本中的 If-modified-since header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10847157/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com