php 如何高效率的判断远程图片是否存在 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
BBOO
V2EX    PHP

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

  •  
  •   BBOO Jun 20, 2016 7175 views
    This topic created in 3597 days ago, the information mentioned may be changed or developed.

    公司有个 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 判断效率很低,请问下各位有没有什么好的办法? 多谢!!!

    19 replies    2016-06-23 20:59:33 +08:00
    hahasong
        1
    hahasong  
       Jun 20, 2016 via iPhone
    听过 QUERY 请求没有
    linauror
        2
    linauror  
       Jun 20, 2016   1
    get_headers
    pubby
        3
    pubby  
       Jun 20, 2016 via Android
    别折磨服务端了,放前端做吧, img onerror 事件
    Kokororin
        4
    Kokororin  
       Jun 20, 2016
    img.onerror
    lslqtz
        5
    lslqtz  
       Jun 20, 2016
    file_get_contents get_headers
    lslqtz
        6
    lslqtz  
       Jun 20, 2016
    <?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
        7
    takwai  
       Jun 20, 2016   1
    HTTP 有个 HEAD 方法,只会返回头信息。然后我不见得有多低效率……
    lslqtz2
        8
    lslqtz2  
       Jun 20, 2016
    @takwai 赞同,但是 curl 效率就够低了。
    在我的 vps 上性能差距 5 倍(保守),实际 15 倍(和 file_get_contents 对比)。
    HEAD 是个好方案,楼主可以根据我上面的改 HEAD ,减去 GET 所需时间。
    lxm
        9
    lxm  
       Jun 20, 2016
    直接把远程服务器上这个域名的 404 请求改为返回默认图片
    tabris17
        10
    tabris17  
       Jun 20, 2016
    跟 php 半毛钱关系都没有, html 就能搞定了

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

    onerror 的做法会造成一次 404 ,不建议使用。
    BBOO
        15
    BBOO  
    OP
       Jun 20, 2016
    感谢各位,由于这个头像地址 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
        16
    xiaojj  
       Jun 20, 2016
    全部用户扫描一遍比较省事
    m3
        17
    m3  
       Jun 20, 2016
    改表改代码
    loadinger
        18
    loadinger  
       Jun 22, 2016
    nginx 不存在返回一个默认图片 。
    lslqtz
        19
    lslqtz  
       Jun 23, 2016 via iPhone
    @BBOO lslq2z 一脸懵逼
    About     Help     Advertise     Blog     API     FAQ     Solana     1004 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 60ms UTC 23:04 PVG 07:04 LAX 16:04 JFK 19:04
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86