ego008 avatar

用curl 代替file_get_contents 解决自动获取微博、QQ头像超时的问题

🕜 by ego008

前段时间有人反映说新用户用QQ或微博登录后,在点设置名字后就不动的现象。原因是获取第三方头像时延时或超时,当时只让用户测试 file_get_contents 能否取到头像,没给出解决办法,个人主要在SAE 或BAE 上使用,没遇到这个问题,最近尝试在vps 上使用,也遇到了这个问题,特别是国外的vps。

用curl 代替file_get_contents 的原因是curl 性能比较好,但可能要额外安装(如果你的服务器没有这个模块)。

在phpinfo() 上看有没有curl 的信息,若没有则先安装,ubuntu 下可使用下面命令安装。

1
sudo apt-get install php5-curl

参考 http://php.net/manual/en/curl.installation.php

参考 http://stackoverflow.com/questions/8540800/php-how-can-use-curl-instead-file-get-contents

稍完善一下得到下面的函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
function curl_file_get_contents($url){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 5);
    curl_setopt($ch, CURLOPT_USERAGENT, _USERAGENT_);
    curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
    $data = curl_exec($ch);
    curl_close($ch);
    return $data;
}
把上面的函数放到/common.php 里,再修改/qqsetname.php 和 /wbsetname.php

屏蔽这一句

: = stream_context_create($opts);```
1
//$avatardata = file_get_contents($imgurl, false, $context);
1
改为
$avatardata = curl_file_get_contents($imgurl);```

💘 相关文章

评论

共20条关于"用curl 代替file_get_contents 解决自动获取微博、QQ头像超时的问题"的评论

ego008 avatar
#1 ego008 回复

别人做过的关于curl和file_get_contents的测试:

file_get_contents抓取google.com需用秒数:

1
2
3
4
5
6
7
8
9
10
11
12
13
2.31319094   
2.30374217   
2.21512604   
3.30553889   
2.30124092  

curl使用的时间:

0.68719101   
0.64675593   
0.64326   
0.81983113   
0.63956594

天晨 avatar
#4 天晨 回复

@admin 在bae用1.6版,用QQ登陆,然后就会出现设置名称页面,但是页面是空白,什么都没有?怎么回事?

admin avatar
#5 admin 回复

@天晨 这个不知道问题出在哪里,你测试一下,看代码可实行到哪里。

admin avatar
#11 admin 回复

@天晨 那可能是/templates/default/qqsetname.php 的问题,看看这个文件能实行到哪里。

天晨 avatar
#12 天晨 回复

@admin 直接打开的话http://www.xxx.com/templates/default/qqsetname.php 出现404页面

直接用手机登陆主页点击QQ登陆,把exit("here n");放到templates/default/qqsetname.php,没反应

jat001 avatar
#13 jat001 回复

@天晨 看 qqsetname.php 最后几行 $pagefile = ROOT . '/templates/default/'.$tpl.'setname.php'; 是 templates/default/setname.php 不是 templates/default/qqsetname.php 别搞错了

天晨 avatar
#14 天晨 回复

@jat001 1.6版本电脑版登陆正常,就是手机版不能登陆,刚在你的博客请教,你回复说没有手机QQ登陆模板,能告诉我怎么添加么?

jat001 avatar
#15 jat001 回复

@天晨 看我第二个回复,有模板,名字错了。把 templates/default/ios_qqsetname.php 改成 ios_setname.php 就行。

天晨 avatar
#16 天晨 回复

太谢谢了。@jat001 搞了两天了。。。终于搞好了。

admin avatar
#19 admin 回复

@天晨 目前使用的是http post form 来上传图片,有些设备不支持也没法了,如苹果。 若支持的要上传图片就切换到桌面版。要么是自己添加那个上传代码。

写一条评论

Based on Golang + fastHTTP + sdb | go1.17.6 Processed in 1ms