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

如何用 PHP 实现速度快的实时获取 QQ 在线状态的函数?

  •  
  •   tension · 2014-05-14 09:38:02 +08:00 · 4763 次点击
    这是一个创建于 3846 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我目前已经实现了 获取在线状态,但是速度很慢。。。

    求加速!

    //QQ在线状态
    function get_qq_status($uin) {
    if($uin > 9999) {
    error_reporting(0);
    $data = file_get_contents("http://webpresence.qq.com/getonline?type=1&{$uin}:");
    $data || $data = strlen(file_get_contents("http://wpa.qq.com/pa?p=2:{$uin}:45"));
    if(!$data) { return 0; }
    switch((string)$data) {
    case '854': case 'online[0]=0;': echo("off");return;
    case '834': case 'online[0]=1;': echo("on");return;
    }
    }
    return 3;
    }
    31 条回复    2014-05-23 01:11:10 +08:00
    belin520
        1
    belin520  
       2014-05-14 09:40:17 +08:00
    看起来没得加速了
    用curl试试?
    wwek
        2
    wwek  
       2014-05-14 09:49:19 +08:00
    我们是 直接js调的,用php过去抓实在是效率低··
    lizheming
        3
    lizheming  
       2014-05-14 09:53:48 +08:00
    通过这个好像只有开通了这个服务的账号才可以获取到状态信息吧?
    simapple
        4
    simapple  
       2014-05-14 10:00:41 +08:00
    获取这个的意义是啥?
    tension
        5
    tension  
    OP
       2014-05-14 10:05:23 +08:00
    @wwek js 掉出来 是显示一张图吧?我想显示一个 class 出来好自己写css
    @simapple 显示客服是否在线啊!
    dongk
        6
    dongk  
       2014-05-14 10:08:56 +08:00
    tx 换个图片就完了
    cst4you
        7
    cst4you  
       2014-05-14 10:09:07 +08:00
    @tension 用ajax方法去读, 然后分析出来的内容
    lizheming
        8
    lizheming  
       2014-05-14 10:10:37 +08:00
    @tension http://www.cnblogs.com/w-y-f/archive/2012/05/30/2526475.html 看第6条..如果是这个功能直接用js比较靠谱啊..
    lincanbin
        9
    lincanbin  
       2014-05-14 10:16:45 +08:00   ❤️ 1
    curl比file_get_contents快不少
    tension
        10
    tension  
    OP
       2014-05-14 10:18:18 +08:00
    @lizheming 我也晓得JS速度快,但是 https 站点啊
    andyhu
        11
    andyhu  
       2014-05-14 10:19:18 +08:00
    后台跑个cron,每隔半分或者一分钟抓取一次,然后放入数据库
    andyhu
        12
    andyhu  
       2014-05-14 10:20:09 +08:00
    @tension 弄个http的iframe可以么
    Actrace
        13
    Actrace  
       2014-05-14 10:28:44 +08:00
    curl会比较快
    tension
        14
    tension  
    OP
       2014-05-14 10:30:33 +08:00
    @andyhu 当然不行
    @lincanbin CURL的我在研究了,速度是快不少
    lizheming
        15
    lizheming  
       2014-05-14 10:33:38 +08:00
    @tension https的话就蛋疼了,好像这个还真没有https的支持...那真的只能好好的抓了T_T
    tension
        16
    tension  
    OP
       2014-05-14 10:37:34 +08:00
    @lizheming 对呀,只能抓了!
    tension
        17
    tension  
    OP
       2014-05-14 10:43:48 +08:00
    其实抓这个页面就ok的

    http://webpresence.qq.com/getonline?type=1&QQ号:

    出来的结果貌似也很快
    tension
        18
    tension  
    OP
       2014-05-14 11:46:41 +08:00
    function get_qq_status($string) {
    $ch = curl_init();
    $timeout = 10;
    curl_setopt ($ch, CURLOPT_URL, "http://webpresence.qq.com/getonline?type=1&{$string}:");
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
    $data = curl_exec($ch);
    curl_close($ch);

    if(!$data) { return 0; }
    switch($data) {
    case 'online[0]=0;':
    echo("off");
    break;
    case 'online[0]=1;':
    echo("on");
    break;
    }
    }

    改成这样 本地测试没问题 ,速度也很快,但是放在服务器就不行了,为什么呢!
    jasontse
        19
    jasontse  
       2014-05-14 12:07:54 +08:00 via iPad   ❤️ 1
    做缓存
    chuangbo
        20
    chuangbo  
       2014-05-14 12:15:29 +08:00
    楼上是正解,我举个例子

    crontab 每分钟在后台获取一次这个数据,然后缓存下来,缓存在文件或者 apc 或者数据库或者 redis 或者其他什么缓存都可以。
    当用户访问的时候,从缓存取出这个数据,并显示。如果缓存中没有,也不要立刻去获取,而是默认显示为不在线。
    codingpp
        21
    codingpp  
       2014-05-14 12:17:04 +08:00
    好接口,从哪里找到的啊?

    楼主追求速度的话 研究下swoole 速度应该能达到极致吧
    tension
        22
    tension  
    OP
       2014-05-14 23:09:47 +08:00
    @chuangbo 我不会写缓存。。。
    tension
        23
    tension  
    OP
       2014-05-14 23:15:32 +08:00
    求个大神 优化我的代码。。。

    现在加载到底部,每次打开需要30s

    影响效率,想把获取状态信息代码写成AJAX的 这样整个页面打开才慢慢加载,不知道效果如何!
    tension
        24
    tension  
    OP
       2014-05-14 23:41:07 +08:00
    已经解决了!速度超快!
    Dwyanetalk
        25
    Dwyanetalk  
       2014-05-14 23:44:39 +08:00
    这个口子是腾讯无意中泄漏出来的口子,官方不建议使用。而且,这个口子有个限制,就是QQ用户必须开通了QQ商家服务(url:http://shang.qq.com/index.php),不然是无法获取的,这个以前是默认开通的,现在好像是默认关闭的。
    tension
        26
    tension  
    OP
       2014-05-14 23:52:51 +08:00
    @Dwyanetalk 目前使用没问题,速度唰唰快!
    Dwyanetalk
        27
    Dwyanetalk  
       2014-05-15 00:03:47 +08:00
    @tension 用户关闭QQ商家服务后,也可以吗?
    tension
        28
    tension  
    OP
       2014-05-15 00:32:25 +08:00
    @Dwyanetalk 我没开过商家服务,你可以给我一个关闭了商家服务 并且在线的QQ 测试一下!
    Delbert
        30
    Delbert  
       2014-05-16 21:18:44 +08:00
    http://kekou.de/qq.php 不是这样的么?
    justplaymore
        31
    justplaymore  
       2014-05-23 01:11:10 +08:00
    搜 php rolling curl
    curl是可以并发的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1101 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 18:55 · PVG 02:55 · LAX 10:55 · JFK 13:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.