用 curl -I 查看 Last-Modified 和 ETag,curl -s URL | sha256sum 比对哈希可确认图片是否更新;加 -H "Cache-Control: no-cache" 绕过缓存;PHP 中 hash_file('sha256', $url, false, $ctx) 更高效,需设超时和 UA;file_get_contents() 易被防盗链拦截,curl_exec() 更可控且支持状态码、重定向等调试。

用 curl 命令直接测图片 URL 是否刷新
不用写 PHP 脚本,命令行 curl 就够用了——尤其当你只想确认「这张图是不是真被更新了」。关键不是发请求,而是看响应头和文件内容是否变化。
-
curl -I https://example.com/photo.jpg查看响应头,重点关注Last-Modified和ETag字段是否变过 -
curl -s https://example.com/photo.jpg | sha256sum计算图片二进制哈希,两次请求结果不一致就说明内容确实刷新了 - 加
-H "Cache-Control: no-cache"或-H "Pragma: no-cache"可绕过本地代理或 CDN 缓存干扰
PHP 里用 file_get_contents() 拿图并比对哈希
如果非得用 PHP 写个简单验证脚本,file_get_contents() 最轻量,但要注意它默认走 HTTP 流,不自动处理重定向或超时。
- 必须设置
stream_context_create()控制超时和用户代理,否则可能卡死:$ctx = stream_context_create(['http' => ['timeout' => 5, 'user_agent' => 'test']]);
- 用
hash_file('sha256', $url, false, $ctx)直接计算远程图片哈希(PHP 7.4+ 支持),比先下载再算快且省内存 - 别用
getimagesize()判断刷新——它只读文件头,改了像素但尺寸不变就测不出来
为什么 file_get_contents() 返回空或 403?常见拦截点
很多图床或 CDN 默认拒绝非浏览器请求,file_get_contents() 发的请求没 User-Agent 或 Referer,直接被挡。
- 检查返回值是否为
false,而不是空字符串——false表示连接失败,空字符串可能是 200 但内容为空(比如防盗链返回 1px gif) - 用
error_get_last()看底层报错,常见如failed to open stream: Connection refused(目标关了 HTTPS)、SSL operation failed(证书问题) - 某些服务要求
Referer必须是白名单域名,此时必须用stream_context_create()显式带上,不能只靠file_get_contents()默认行为
用 curl_exec() 更可控,但别漏掉 curl_setopt() 关键项
比 file_get_contents() 多几行代码,换来的是可调试性——尤其是查缓存、重定向、HTTP 状态码这些。
立即学习“PHP免费学习笔记(深入)”;
- 必须设
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true),否则输出直接打屏,没法做后续判断 - 加
curl_setopt($ch, CURLOPT_HEADER, true)+curl_setopt($ch, CURLOPT_NOBODY, true)可只取响应头,省带宽 - 别忽略
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true):有些图床会 302 跳转到 CDN 地址,不跟就拿到跳转页 HTML 而不是图 - 用
curl_getinfo($ch, CURLINFO_HTTP_CODE)检查状态码,200才代表图正常返回;304说明服务端判定未修改,但你本地可能还缓着旧图
?v=123)没变,服务端根本没触发新版本下发——这时候光测请求没用,得去源头确认发布逻辑。











