处理 PHP 脚本中的 If-modified-since 标头

2024-03-19

我有一个 PHP 脚本,用?img=范围。

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

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

如果没有 - 它会下载它。之后,它可以选择调整图像大小并将其发送到 STDOUT,即返回到请求浏览器,前面加上内容类型 and 上一次更改标题:

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

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

不过我想添加功能来处理传入的如果-修改-自header - 发送未修改304回复。

我的问题是:

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

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

奖金问题)如何添加内容长度调整大小的图像的标题?

我的代码如下(我省略了 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标头;在 PHP 中,该值将在内部设置$_SERVER['HTTP_IF_MODIFIED_SINCE'].

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

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标头由浏览器发送,并且日期/时间至少是您所服务的文件的修改日期,您写入“304 Not Modified”标头并停止。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

处理 PHP 脚本中的 If-modified-since 标头 的相关文章

  • foreach 循环中 current() 的意外行为[重复]

    这个问题在这里已经有答案了 这是一个简单的循环 list array A B C D foreach list as var print current list Output demo http 3v4l org sBDjl BBBB O
  • 无需 cron 在后台发送邮件

    我想知道是否有一种方法可以运行 PHP 循环 以便在后台向订阅者发送几百封电子邮件 我的目标是格式化新闻通讯 单击发送 然后关闭浏览器或更改页面 当然 发送电子邮件的实际过程将在后台运行 不会因浏览器关闭而中断 我知道这可以通过 cron
  • 我应该在 PHP 代码中使用断言吗?

    一位同事添加了assert http php net assert在我们的库中 在我本来会使用 if 语句并引发异常的地方执行几次命令 在此之前我什至从未听说过断言 以下是他如何使用它的示例 assert isset this gt rec
  • 从远程托管上的 PHP 获取 PHP 错误日志

    是否有 PHP 函数或其他方式以字符串形式获取 PHP 错误日志 我需要这个 因为我无法访问在其他人的服务器上运行的站点的错误日志 他提出通过电子邮件将错误日志发送给我 但这不太方便 有什么方法可以将错误日志输出到 PHP 页面吗 我意识到
  • 在 PHP 中设置 HTTP 响应代码(在 Apache 下)

    给出以下两种在 PHP 中设置 HTTP 响应代码的方法 具体来说 在 Apache 下 方法一 http response code 404 方法二 header HTTP 1 0 404 Not Found 我的问题是 除了这个事实之外
  • node-mongodb-native的插入性能

    我正在使用 MongoDB 测试 Node js 的性能 我知道其中每一个都很好 彼此独立 但我正在尝试一些测试来感受它们 我遇到了这个问题 但无法确定来源 问题 我正在尝试在单个 Node js 程序中插入 1 000 000 条记录 它
  • 间歇性 PHP 抽象类错误

    我已经为此奋斗了一段时间 但无法弄清楚 也许其他人也有 或者 Slim PHP Apache 等这里有更深层次的问题 在正常工作几个小时后 我的 Slim 安装将开始给出所有路线均如此 致命错误 类 Slim Collection 包含 1
  • php动态创建子域的问题

    你好 我通过以下代码在 php 中创建子域 function subd host port ownername passw request sock fsockopen localhost 2082 if sock print Socket
  • Doctrine 装置如何覆盖 purger 类?

    From doctrine fixture bundle the console doctrine fixtures load n命令定义如下 https github com doctrine DoctrineFixturesBundle
  • 如何使用 AJAX/jQuery 显示打印内容?

    所以我试图理解整个 AJAX jQuery 的事情 现在 当我单独运行这个 PHP 脚本时 我必须等待并观察轮子旋转 直到循环完成然后加载 while row mysql fetch array res postcode to storm
  • 将具有值的产品属性添加到 Woocommerce 中的产品

    我正在使用此代码添加自定义属性 attributes array array name gt Size options gt array S L XL XXL position gt 1 visible gt 1 variation gt
  • 如何检查 $row['column_name'] 是否返回空 php mysql

    我有一个带有列的表格 id name phone describe 当我从这个表中获取值时 我正在使用 row mysql fetch array query 现在我想检查是否 row describe 返回空值 如何查看php 您可以使用
  • 管理面板的 htaccess 重写规则

    我的网络应用程序中有这样的 url 模式 www mysitename com foldername controller method 所有请求的页面首先被重定向到根文件夹上的index php 然后处理请求的页面 但每当我进入管理面板
  • PHP括号少IF条件不接受多个语句

    我从来都不喜欢控制结构中的括号 直到今天我才意识到它如何只接受括号内的一条语句而不是 if 条件 如果我有多个语句 它会抛出语法错误 这是 PHP 的工作方式还是我的 IDE 有问题 显然错误很明显 但我只是想确保这是正常的 如果您有任何其
  • C++ php 和静态库

    我创建了一个library a 其中包含 cpp 和 h 文件 其中包含很多类 嵌套类和方法 我想在 php 示例中包含这个静态库并尝试使用它 我想提一下 我是 php 新手 我已经在 test cpp 文件中测试了我的 libray a
  • 是否可以使用流上下文在 PHP 下使用 FTPS?

    我了解到使用ftpsPHP for Windows 下的 ftp ssl connect 很困难 您被要求进入构建自己的二进制文件以包括 Open SSL 的漫长旅程 我找到了以下建议phpseclib http phpseclib sou
  • 计算特定产品类别的购物车商品数量

    我试图仅从 WooCommerce 中的特定产品类别获取购物车中的商品数量 我正在为一家酒厂做一个网站 它有酒精和非酒精产品 所有葡萄酒都属于 葡萄酒 主类别或类别 ID 34 其下有许多子类别和产品 对于属于此类别的任何商品 我需要知道此
  • 使用 PHP 将 SVG 图像转换为 PNG

    我正在开发一个网络项目 该项目涉及动态生成的美国地图 根据一组数据为不同的州着色 这个 SVG 文件为我提供了一张很好的美国空白地图 并且很容易更改每个州的颜色 困难在于 IE 浏览器不支持 SVG 因此为了让我使用 svg 提供的便捷语法
  • preg_match 所有以@开头的单词?

    我对正则表达式不太确定 所以我不得不问你 如何用 PHP 判断字符串中是否包含以 开头的单词 例如我有一个像 This is for codeworxx 这样的字符串 我很抱歉 但我没有任何起点 希望你能帮忙 谢谢 萨沙 好的 谢谢你的结果
  • 合并 csv 文件 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何在 PHP 或 joomla 中将多个 CSV 文件合并为一个 csv 文件 将文件夹中 csv 文件中的所有数据合并到文本文件中 通

随机推荐

  • C Master Volume Windows 中的 __uuidof

    我想用 C 改变主音量 但是 uuidof仅适用于 C 我可以用什么来代替它 const CLSID CLSID MMDeviceEnumerator uuidof MMDeviceEnumerator const IID IID IMMD
  • 在JavaScript中使用bind来避免闭包是否正确?

    闭包对于浏览器的内存来说是否太糟糕了 在 JavaScript 中使用 bind 避免闭包是一个好方法吗 现有代码 var oControl new Control var self this click function e closur
  • 我正在尝试使用 Firebase 在 Flutter 中使用 google 注销,但它不起作用

    我将 Flutter 与 Firebase 结合使用 当我尝试使用电子邮件和密码注销时 效果很好 但当我尝试使用谷歌时 它不起作用 这是我的代码 try switch user providerData 0 providerId case
  • IIS7 集成与经典管道 - 哪个使用更多 ASP.NET 线程?

    通过集成管道 所有请求都通过 ASP NET 传递 包括图像 CSS 而在经典管道中 默认情况下仅通过 ASP NET 传递对 ASPX 页面的请求 集成管道会对线程使用产生负面影响吗 假设我从 IIS 服务器请求 500 MB 二进制文件
  • Eclipse Oxygen 的 Lombok 问题

    我最近升级到了新的 Eclipse 版本 Oxygen 我从网站下载了 lombok jar 并安装了它 这就是如何eclipse ini安装后的样子 startup plugins org eclipse equinox launcher
  • Android Volley Https SSL 自签名和 Google Maps API

    我们正在使用 Android Volley 并使用可以正常工作的自认证 SSL 但现在我们想要实现 Google 地图 但它不起作用 它只是不会抛出任何错误 它只是显示一个灰色的屏幕 This is our implementation o
  • Shell脚本:在不排序的情况下查找整数序列中的最大值

    我有一个包含一长串整数的文件 10 4 66 我想使用 UNIX 命令行工具找到最大值 我知道我可以使用sort 事实上 这个问题有解决方案 使用sort 但是效率很低 需要 O N log N 和大量内存 通过一个简单的 for 循环 我
  • 为什么我的故事板中的视图控制器不断消失?

    我的故事板文件中的视图控制器不断消失 截至目前 我必须按向上箭头并突出显示每个项目才能恢复我的视图控制器 我可以做些什么来摆脱这个问题 还有什么我可以做的来将这些消失的视图控制器恢复到我的故事板上 这是一个错误 通常我可以通过关闭故事板并重
  • jquery只获取所有带有id的html元素

    我有一个 div 其中有很多 html 元素 如其他 div trs tds 表格等 是否可以获取所有具有 id 的元素 我知道问 test 会给我这个 id 的特定元素 但有可能得到find 或者类似的东西 id 返回所有设置了 id 的
  • WOW.js + 查询加载器 2

    我有一个问题WOW js https github com matthieua WOW and 查询加载器2 http gayadesign com diy queryloader2 preload your images with eas
  • vcruntime140.dll 与 vcruntime140d.dll

    这两个dll有什么区别vcruntime140 dll and vcruntime140d dll 为什么我们需要它们 它们都是 Microsoft Visual C 2015 Redistributable 的一部分吗 谷歌搜索了很长一段
  • 无论我做什么,NSLayoutManager 都会隐藏新行字符

    我正在尝试显示不可见的字符 例如 NSTextView 子类中的换行符 像重写 NSLayoutManager 的 drawGlyph 方法这样的常用方法是一个坏主意 因为它太慢并且无法在多页布局中正常工作 我想做的是重写 NSLayout
  • 如何监控客户端与 WCF 服务的连接?

    我创建了一个 WCF 服务 其中 ServiceHost 类无法实例化为单例 我需要监视与该服务的每个连接 甚至在第一次调用与其关联的方法之前也是如此 在实践中 我想记录客户端何时打开与服务通信的通道 是否可以 在网上我找到的解决方案只有两
  • 从字符串中删除第一个字符

    有没有办法删除或替换为 the X 从词的开头 Ex XN5634 erX123 erNX45 期望的输出 N5634 er123 erNX45 我总共有大约14000字 我用了 gsub X mylist fixed T but X被移除
  • 加载 CharSequence 时出错(scala 2.11.4)

    他们建议我更新 scala 所以我这样做了 scala version Scala code runner version 2 11 4 Copyright 2002 2013 LAMP EPFL 但这个错误仍然存 在 my project
  • 如何更改选项菜单的背景颜色?

    我正在尝试更改选项菜单的默认颜色为白色 我希望选项菜单上的每个项目都有黑色背景 我已经在菜单元素内的项目元素上尝试了一些像 android itemBackground 000000 的拍摄 但它不起作用 我怎样才能做到这一点 在花费了大量
  • window.location.href 与 React-router-dom 的重定向实用程序

    我有使用 React 和 React Router 编写的 webapp 使用 window location href 进行重定向与使用通过 React router 提供的组件有什么优点 缺点 Use history push page
  • 如何使用Python向Firebase中的用户发送电子邮件验证码?

    我正在做一个KivyMD应用程序和我想在用户注册应用程序时发送电子邮件验证码 我正在使用一个firestore数据库与python对于这个项目 但我没有这样做的想法 注册流程是 用户使用他的电子邮件地址注册该应用程序 电子邮件包含一个代码
  • 编辑/保存 CSV 文件中的行

    遵循此操作后topic https stackoverflow com questions 13100139 update one column in csv file c sharp我能够创造 新行 但我的问题是怎么做 我将新行保存或写入
  • 处理 PHP 脚本中的 If-modified-since 标头

    我有一个 PHP 脚本 用 img 范围 该参数的值是图像的 urlencoded URL 我的脚本检查该图像是否已存储在我的服务器上 如果没有 它会下载它 之后 它可以选择调整图像大小并将其发送到 STDOUT 即返回到请求浏览器 前面加