php 如何高效率的判断远程图片是否存在

2016-06-20 11:31:44 +08:00
 BBOO

公司有个 dz 的论坛,用户附件放在了另一台服务器上,包括用户头像,头像访问的时候直接远程 url(如: http://static.abc.com/avatar/000/00/37/98_avatar_middle.jpg)。 如果用户没有上传头像的话默认使用本地头像 http://bbs.abc.com/uc_server/images/noavatar_middle.gif 。 由于 dz 用户头像没有存数据库,访问头像直接用用户 ID 拼接成的固定的 url,原程序中判断图片是否存在使用 file_exists ,但现在头像放在了另一台服务器,无法使用这个函数,使用 curl 判断效率很低,请问下各位有没有什么好的办法? 多谢!!!

6627 次点击
所在节点    PHP
19 条回复
hahasong
2016-06-20 11:34:26 +08:00
听过 QUERY 请求没有
linauror
2016-06-20 11:35:04 +08:00
get_headers
pubby
2016-06-20 11:37:20 +08:00
别折磨服务端了,放前端做吧, img onerror 事件
Kokororin
2016-06-20 11:38:46 +08:00
img.onerror
lslqtz
2016-06-20 11:39:26 +08:00
file_get_contents get_headers
lslqtz
2016-06-20 11:40:22 +08:00
<?php
error_reporting(0);
header('content-type:application/json');
$data='vssfafsa=dgastgdagda&xfafafaf=tgfdfdsafa';
$opts=array(
'http'=>array(
'method'=>'POST',
'header'=>"Content-type:application/x-www-form-urlencoded\r\nContent-length:".strlen($data),
'content'=>$data
));
file_get_contents('http://www.baidu.com',false,stream_context_create($opts));
if ($http_response_header[0] == 'HTTP/1.1 302 Moved Temporarily') {
echo '{"code":200}';
} else {
echo '{"code":403}';
}
?>
这样?
takwai
2016-06-20 11:41:02 +08:00
HTTP 有个 HEAD 方法,只会返回头信息。然后我不见得有多低效率……
lslqtz2
2016-06-20 11:44:46 +08:00
@takwai 赞同,但是 curl 效率就够低了。
在我的 vps 上性能差距 5 倍(保守),实际 15 倍(和 file_get_contents 对比)。
HEAD 是个好方案,楼主可以根据我上面的改 HEAD ,减去 GET 所需时间。
lxm
2016-06-20 12:26:29 +08:00
直接把远程服务器上这个域名的 404 请求改为返回默认图片
tabris17
2016-06-20 12:31:20 +08:00
跟 php 半毛钱关系都没有, html 就能搞定了

<img src="xxxxx" data-localsrc="yyyyy" onerror="... ...">
raysonx
2016-06-20 12:50:08 +08:00
或者用 Web 服务器反代 avatar 服务器,并替换 404 结果
eoo
2016-06-20 13:59:16 +08:00
。。。。。
imn1
2016-06-20 14:03:59 +08:00
百毒忘了哪个地方的 onerror 是重载图片,图片不存在,结果就……
mudone
2016-06-20 14:04:52 +08:00
1 、 Web 上所有的头像都使用远程 URL ;
2 、远程服务器上做个 rewrite :当访问的头像文件不存在的时候,返回默认头像的内容。

onerror 的做法会造成一次 404 ,不建议使用。
BBOO
2016-06-20 14:09:23 +08:00
感谢各位,由于这个头像地址 app 也在调用,考虑到旧版兼容性,客户端无法做处理。
nginx 改 404 的方法,运维说用了什么云, nginx 改不了。
用了 @lslqt2z 、 @takwai 的方法,加了个超时时间,测试了响应速度还不错,感谢!!!
以下是改后的代码:
function exit_file($url){
$opts=array(
'http'=>array(
'method'=>'HEAD',
'timeout'=>2
));
file_get_contents($url,false,stream_context_create($opts));
if ($http_response_header[0] == 'HTTP/1.1 200 OK') {
return true;
} else {
return false;
}
}
xiaojj
2016-06-20 14:21:41 +08:00
全部用户扫描一遍比较省事
m3
2016-06-20 14:30:06 +08:00
改表改代码
loadinger
2016-06-22 15:52:48 +08:00
nginx 不存在返回一个默认图片 。
lslqtz
2016-06-23 20:59:33 +08:00
@BBOO lslq2z 一脸懵逼

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/286977

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX