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

2014-05-14 09:38:02 +08:00
 tension
我目前已经实现了 获取在线状态,但是速度很慢。。。

求加速!

//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;
}
4785 次点击
所在节点    程序员
31 条回复
belin520
2014-05-14 09:40:17 +08:00
看起来没得加速了
用curl试试?
wwek
2014-05-14 09:49:19 +08:00
我们是 直接js调的,用php过去抓实在是效率低··
lizheming
2014-05-14 09:53:48 +08:00
通过这个好像只有开通了这个服务的账号才可以获取到状态信息吧?
simapple
2014-05-14 10:00:41 +08:00
获取这个的意义是啥?
tension
2014-05-14 10:05:23 +08:00
@wwek js 掉出来 是显示一张图吧?我想显示一个 class 出来好自己写css
@simapple 显示客服是否在线啊!
dongk
2014-05-14 10:08:56 +08:00
tx 换个图片就完了
cst4you
2014-05-14 10:09:07 +08:00
@tension 用ajax方法去读, 然后分析出来的内容
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
2014-05-14 10:16:45 +08:00
curl比file_get_contents快不少
tension
2014-05-14 10:18:18 +08:00
@lizheming 我也晓得JS速度快,但是 https 站点啊
andyhu
2014-05-14 10:19:18 +08:00
后台跑个cron,每隔半分或者一分钟抓取一次,然后放入数据库
andyhu
2014-05-14 10:20:09 +08:00
@tension 弄个http的iframe可以么
Actrace
2014-05-14 10:28:44 +08:00
curl会比较快
tension
2014-05-14 10:30:33 +08:00
@andyhu 当然不行
@lincanbin CURL的我在研究了,速度是快不少
lizheming
2014-05-14 10:33:38 +08:00
@tension https的话就蛋疼了,好像这个还真没有https的支持...那真的只能好好的抓了T_T
tension
2014-05-14 10:37:34 +08:00
@lizheming 对呀,只能抓了!
tension
2014-05-14 10:43:48 +08:00
其实抓这个页面就ok的

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

出来的结果貌似也很快
tension
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
2014-05-14 12:07:54 +08:00
做缓存
chuangbo
2014-05-14 12:15:29 +08:00
楼上是正解,我举个例子

crontab 每分钟在后台获取一次这个数据,然后缓存下来,缓存在文件或者 apc 或者数据库或者 redis 或者其他什么缓存都可以。
当用户访问的时候,从缓存取出这个数据,并显示。如果缓存中没有,也不要立刻去获取,而是默认显示为不在线。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/112448

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX