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