公司有个 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 判断效率很低,请问下各位有没有什么好的办法? 多谢!!!
1
hahasong 2016-06-20 11:34:26 +08:00 via iPhone
听过 QUERY 请求没有
|
2
linauror 2016-06-20 11:35:04 +08:00 1
get_headers
|
3
pubby 2016-06-20 11:37:20 +08:00 via Android
别折磨服务端了,放前端做吧, img onerror 事件
|
4
Kokororin 2016-06-20 11:38:46 +08:00
img.onerror
|
5
lslqtz 2016-06-20 11:39:26 +08:00
file_get_contents get_headers
|
6
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}'; } ?> 这样? |
7
takwai 2016-06-20 11:41:02 +08:00 1
HTTP 有个 HEAD 方法,只会返回头信息。然后我不见得有多低效率……
|
8
lslqtz2 2016-06-20 11:44:46 +08:00
@takwai 赞同,但是 curl 效率就够低了。
在我的 vps 上性能差距 5 倍(保守),实际 15 倍(和 file_get_contents 对比)。 HEAD 是个好方案,楼主可以根据我上面的改 HEAD ,减去 GET 所需时间。 |
9
lxm 2016-06-20 12:26:29 +08:00
直接把远程服务器上这个域名的 404 请求改为返回默认图片
|
10
tabris17 2016-06-20 12:31:20 +08:00
跟 php 半毛钱关系都没有, html 就能搞定了
<img src="xxxxx" data-localsrc="yyyyy" onerror="... ..."> |
11
raysonx 2016-06-20 12:50:08 +08:00 via Android
或者用 Web 服务器反代 avatar 服务器,并替换 404 结果
|
12
eoo 2016-06-20 13:59:16 +08:00 via Android
。。。。。
|
13
imn1 2016-06-20 14:03:59 +08:00
百毒忘了哪个地方的 onerror 是重载图片,图片不存在,结果就……
|
14
mudone 2016-06-20 14:04:52 +08:00
1 、 Web 上所有的头像都使用远程 URL ;
2 、远程服务器上做个 rewrite :当访问的头像文件不存在的时候,返回默认头像的内容。 onerror 的做法会造成一次 404 ,不建议使用。 |
15
BBOO OP 感谢各位,由于这个头像地址 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; } } |
16
xiaojj 2016-06-20 14:21:41 +08:00
全部用户扫描一遍比较省事
|
17
m3 2016-06-20 14:30:06 +08:00
改表改代码
|
18
loadinger 2016-06-22 15:52:48 +08:00
nginx 不存在返回一个默认图片 。
|