V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
BBOO
V2EX  ›  PHP

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

  •  
  •   BBOO · 2016-06-20 11:31:44 +08:00 · 6456 次点击
    这是一个创建于 2868 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    onerror 的做法会造成一次 404 ,不建议使用。
    BBOO
        15
    BBOO  
    OP
       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
        16
    xiaojj  
       2016-06-20 14:21:41 +08:00
    全部用户扫描一遍比较省事
    m3
        17
    m3  
       2016-06-20 14:30:06 +08:00
    改表改代码
    loadinger
        18
    loadinger  
       2016-06-22 15:52:48 +08:00
    nginx 不存在返回一个默认图片 。
    lslqtz
        19
    lslqtz  
       2016-06-23 20:59:33 +08:00 via iPhone
    @BBOO lslq2z 一脸懵逼
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1086 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 18:24 · PVG 02:24 · LAX 11:24 · JFK 14:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.